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

时间:2015-11-30 19:38:21

标签: mysql sql database-design architecture database-normalization

考虑旅行行程。旅游有20个可能的站点。标准旅行包括按顺序停止1到20。但是,每个用户可以按任何顺序创建自己的游览,包括5个或更多个停靠点,并且可能重复。在数据库中对此进行建模的最有效方法是什么?

如果我们使用联接表
user_id, stop_id, order
我们很快就会有数百万条记录,但我们可以很容易地停下来。查询的用户属性。

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

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

2 个答案:

答案 0 :(得分:2)

我将定义实体并为它们创建表,并在第一个示例中描述的单独表中使用它们之间的关系:

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

对于查询表格,对于任何想要查看其游览的用户,您可以使用tours_users表格来实现此目的,如果需要检索停靠点,您可以轻松加入tours_users表格通过stops_order的{​​{1}}表。

如果表格索引正确,那么性能应该没有问题,您将按原样使用关系数据库引擎。

答案 1 :(得分:1)

您认为节省一些空间会对您有所帮助。它没有赢。它也可以说你实际节省了多少空间。

您还使用无序数据结构 - 这是您不想要的。您需要有序结构(表),它可以与其他记录相关 - 这正是我们对表进行规范化的原因 - 因此我们可以在不改变物理位置的情况下推断所有类型的数据。另一个好处是有序结构可以编入索引,我们可以减少查找记录的时间。权衡是花费空间来保持指数记录。

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

TL; DR:保持正常化