跨表与存储列表的“有许多”问题的数据库设计

DB Design for "has many" issue across tables vs stored lists

提问人:k00k 提问时间:10/28/2009 最后编辑:Brian Tompsett - 汤莱恩k00k 更新时间:1/15/2017 访问量:173

问:

试图找出为用户设置集合“列表”的最佳方法,给定以下数据(伪代码):

user table = id, name, email

cars table = id, make, model

user_cars table = user_id, car_id, rating

collections table = id, user_id, name

事实

  • 用户可以拥有多辆车

  • 用户可以拥有多个集合

  • 单辆车可以有多个收藏

我看到的允许用户拥有集合列表的 2 个选项是向被调用user_cars添加一个字段,并使该字段的内容成为用户拥有的集合的逗号列表,例如:1,30,400collection_list

或者添加一个名为 的附加表,该表包含 和 ,每个表都指向各自的 collections.id 和 cars.id。我看到添加另一个表的可能问题是该表中的行数会变得很大。例如:10,000 个用户 x 每个 10 个集合 x 每个集合 100 辆汽车 = 100 万行。collection_entriescollection_idcar_id

想法?

MySQL的 列表 数据结构 数据库设计

评论


答:

1赞 user254875486 10/28/2009 #1

如果我理解正确的话,一个集合恰好有 1 个所有者?

所以:

users: user_id, name

cars: car_id, name

collection_cars: collectioncar_id, collection_id, car_id

collections: collection_id, user_id, name

因此,对于每个集合,您将哪些汽车存储在单独的表格中。如果您正确使用索引,我认为 100 万行不会是一个大问题。 我不认为放弃一个好的数据库设计是一个好主意,因为你害怕有很多行。数据库旨在处理大型数据集,因此您可以将其用于此目的。其次;如果你为每个用户存储他们拥有的汽车,你还必须存储这辆车属于哪个集合,这样你就不会得到任何东西。

评论

0赞 k00k 10/28/2009
谢谢。我创建了另一个表。
1赞 northpole 10/28/2009 #2

第二个选项称为交集表:

交集表,第三个, 创建的中间表 实现多对多关系 在两个实体之间。也称为 结点、中间结或分辨率 桌子。两者中的主键 实体被放置在 交集表作为外键。 通常,这两者形成复合材料 主键。

您肯定要使用第二个选项。这更适合查询设计和在客户端上使用 resultSet。只要正确完成索引,大多数数据库都足够高效,可以处理此设计。