多个大列表的数据库设计模式

Database Design Pattern for Multiple Large Lists

考虑旅行路线。一次旅行有 20 个可能的停靠站。标准游览包括依次停靠站 1 到 20。但是,每个用户都可以创建自己的旅程,其中包含 5 个或更多站点,顺序不限,可以重复。在数据库中对此建模的最有效方法是什么?

如果我们使用连接 table
user_id, stop_id, order
我们很快就会有数百万条记录,但我们可以轻松地在查询中提取停止和用户属性。

如果我们将停靠点存储为数组,
user_id, stop_id_array_in_order
我们有一个小得多的非规范化 table 并且我们无法轻松访问停止属性。

是否有其他选项允许在最小化 table 大小的同时访问父属性?

我将定义实体并为它们创建 tables,并在单独的 tables 中创建它们之间的关系,如您在第一个示例中所述:

users table
tours table
stops table
tours_users table (a User can go to a Tour more than once)
stops_order table: stop_id, order, tours_users_id

要查询 tables,对于任何您想查看他们的游览的用户,您可以使用 tours_users table 实现此目的,如果需要检索停靠点,您可以通过 tours_users_id.

轻松加入 tours_users table 和 stops_order table

如果 table 索引正确,性能应该没有问题,您将按预期使用关系数据库引擎。

您认为节省一些 space 会对您有所帮助。它不会。您实际节省了多少 space 也是有争议的。

您还会使用 无序 数据结构 - 这是您不想要的。您需要 ordered 结构 (table),它可以与其他记录相关 - 这正是我们规范化 tables 的原因 - 所以我们可以推断各种数据而不改变物理位置。另一个好处是可以索引有序结构,我们可以减少查找记录的时间。权衡是花费 space 来保存索引记录。

但是,数百万、数十亿 - 甚至数万亿行都可以。试想一下,查询一个数组在一列(或多列)中保存为逗号分隔列表的结构会有多困难。编写查询将是一场噩梦,并且性能会随着记录量的增加而线性下降。

TL;DR:保持正常化