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

Mysql 多个大型列表的数据库设计模式,mysql,sql,database-design,architecture,database-normalization,Mysql,Sql,Database Design,Architecture,Database Normalization,考虑一个旅行计划。一次旅行可能有20站。一次标准的旅行包括按顺序从1站到20站。但是,每个用户都可以创建自己的巡演,包括5个或5个以上的站点,可以按任意顺序重复。在数据库中对此进行建模的最有效方法是什么 如果我们使用联接表 user\u id、stop\u id、order 我们将很快拥有数百万条记录,但我们可以轻松地在查询中提取stop和user属性 如果我们将站点存储为数组, 用户id,按顺序停止id\u数组 我们有一个小得多的非规范化表,无法轻松访问stop属性 是否有其他选项允许在最小化

考虑一个旅行计划。一次旅行可能有20站。一次标准的旅行包括按顺序从1站到20站。但是,每个用户都可以创建自己的巡演,包括5个或5个以上的站点,可以按任意顺序重复。在数据库中对此进行建模的最有效方法是什么

如果我们使用联接表
user\u id、stop\u id、order

我们将很快拥有数百万条记录,但我们可以轻松地在查询中提取stop和user属性

如果我们将站点存储为数组,
用户id,按顺序停止id\u数组

我们有一个小得多的非规范化表,无法轻松访问stop属性


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

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

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\u users
表来实现,如果需要检索站点,您可以通过
tours\u users\u id
轻松地将
tours\u users
表与
stops\u order
表连接起来


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

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

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\u users
表来实现,如果需要检索站点,您可以通过
tours\u users\u id
轻松地将
tours\u users
表与
stops\u order
表连接起来


如果表的索引正确,那么性能应该不会有问题,并且您将按照预期使用关系数据库引擎。

您认为节省一些空间会对您有所帮助。不会的。你到底能节省多少空间也是有争议的

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

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


TL;DR:使其正常化

您认为节省一些空间会对您有所帮助。不会的。你到底能节省多少空间也是有争议的

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

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


TL;DR:使其规范化

不要存储为数组。它违背了使用关系数据库的目的,关系数据库就是关联数据大桌子不是问题。有很多数据库的表包含数十亿/万亿条记录。不要存储为数组。它违背了使用关系数据库的目的,关系数据库就是关联数据大桌子不是问题。有很多数据库的表有数十亿/万亿条记录。与
tour\u用户
表上的
order
列相比,
stops\u order
表有什么好处?您建议使用一个带有
tour\u id、user\id、stop\u id、order
的表来解决您的问题,但最终会在数据中产生大量冗余。为每个
用户/巡演
创建5个以上的记录,每次在一个庞大的数据集上从中提取类似于
每个用户巡演
的内容,从长远来看是非常昂贵的。对不起,我不清楚。我们不需要旅游表。需要
用户表
停止表
用户停止表
。在
user\u stops\u表中
我们有
user\u id
stop\u id
订单
。每个用户只能有一次巡更。与
tour\u users
表上的
order
列相比,
stops\u order
表有什么好处?您建议使用一个表,其中包含
tour\u id、user\u id、stop\u id、order
,这解决了您的问题,但最终会导致大量数据冗余。为每个
用户/巡演
创建5个以上的记录,每次在一个庞大的数据集上从中提取类似于
每个用户巡演
的内容,从长远来看是非常昂贵的。对不起,我不清楚。我们不需要旅游表。需要
用户表
停止表
用户停止表
。在
user\u stops\u表中
我们有
user\u id
stop\u id
订单
。每个用户只能有一次巡更。