提问人:k00k 提问时间:10/28/2009 最后编辑:Brian Tompsett - 汤莱恩k00k 更新时间:1/15/2017 访问量:173
跨表与存储列表的“有许多”问题的数据库设计
DB Design for "has many" issue across tables vs stored lists
问:
试图找出为用户设置集合“列表”的最佳方法,给定以下数据(伪代码):
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_entries
collection_id
car_id
想法?
答:
如果我理解正确的话,一个集合恰好有 1 个所有者?
所以:
users: user_id, name
cars: car_id, name
collection_cars: collectioncar_id, collection_id, car_id
collections: collection_id, user_id, name
因此,对于每个集合,您将哪些汽车存储在单独的表格中。如果您正确使用索引,我认为 100 万行不会是一个大问题。 我不认为放弃一个好的数据库设计是一个好主意,因为你害怕有很多行。数据库旨在处理大型数据集,因此您可以将其用于此目的。其次;如果你为每个用户存储他们拥有的汽车,你还必须存储这辆车属于哪个集合,这样你就不会得到任何东西。
评论
第二个选项称为交集表:
交集表,第三个, 创建的中间表 实现多对多关系 在两个实体之间。也称为 结点、中间结或分辨率 桌子。两者中的主键 实体被放置在 交集表作为外键。 通常,这两者形成复合材料 主键。
您肯定要使用第二个选项。这更适合查询设计和在客户端上使用 resultSet。只要正确完成索引,大多数数据库都足够高效,可以处理此设计。
下一个:Linq 类型转换问题
评论