数据库设计跨表和存储列表“有很多”问题

时间:2009-10-27 16:01:28

标签: mysql list data-structures database-design

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

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添加一个名为collection_list的字段,并使该字段的内容成为用户拥有的集合的逗号列表,如:1,30,400

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

想法?

2 个答案:

答案 0 :(得分: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万行不会是一个大问题。 我不认为放弃一个好的数据库设计是一个好主意,因为你害怕有很多行。数据库旨在处理大型数据集,因此您可以使用它们。其次;如果您为每个用户存储他们拥有的汽车,您还必须存储该汽车所属的集合,这样您就无法获得任何收益。

答案 1 :(得分:1)

您的第二个选项称为交叉表:

  

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

您肯定想要使用第二个选项。这对于查询设计和在客户端上使用resultSets更好。只要正确完成索引,大多数数据库都足以处理此设计。