我想知道在同一个表之间建立多个多对多关系时是否有最佳做法。
目前,user
和item
之间的用户与用户创建的项目之间存在多对多关系。
---------------------
| user_id | item_id |
---------------------
| 1 | 3 |
---------------------
我想为user
和item
创建另一个联结表,以引用他们的监视列表。我应该创建单独的多对多表吗?
user_item_inventory user_item_watchlist
--------------------- ---------------------
| user_id | item_id | | user_id | item_id |
--------------------- ---------------------
| 1 | 3 | | 2 | 3 |
--------------------- ---------------------
或者,我应该创建一个与user_item_type
表具有多对一关系的多对多表吗?
user_item user_item_type
------------------------------- ------------------
| user_id | item_id | type_id | | id | name |
------------------------------- ------------------
| 1 | 3 | 1 | | 3 | inventory |
------------------------------- ------------------
| 2 | 3 | 2 | | 2 | watchlist |
------------------------------- ------------------
答案 0 :(得分:2)
虽然决定最终取决于概念上不同的库存和愿望清单,但根据以往的经验,我建议使用单独的表格。
目前,您没有附加到广告资源或关注列表的其他数据,但未来情况不一定如此。如果不了解有关广告资源和关注列表的更多详细信息,则很难进行预测,但只要您想开始跟踪inventory
关系与watchlist
关系的其他数据,就会生成单独的表格事情很多更简单。只要您想添加仅属于您的某种关联类型的列,您就会想要单独的表格。
正如在另一个答案中指出的那样,从纯数据存储和检索的角度来看,拥有单独的表肯定更快:你可以减少一个列/索引来填充/过滤。如果您的库存/心愿单关联表变得“大”,那些额外的type_id
引用将开始累加到重要的东西。 (对于较小的大小,这无关紧要,但除了明显的磁盘存储因素外,更多数据需要更多内存和更多缓存来管理,尤其是涉及索引时。)
如果您需要知道所有用户感兴趣的项目(库存,监视列表以及您可能创建的任何其他类似表格的组合),则单独的表格将是复杂的,但是如果这是一个实际需要,然后您可以使用所有表上的UNION
查询轻松生成该列表。 (如果需要,您甚至可以创建另一个包含所有用户 - 项目引用副本的表作为性能增强。)
答案 1 :(得分:0)
它取决于您希望如何使用这些数据。如果它们在逻辑上是分开的并且它们之间没有相关性,那么您可以使用两个表。 如果您要显示库存和监视列表记录,在某些模块中,并且您只想区分记录类型,那么您可以使用一个记录类型的表。
很明显,对于数据库引擎,最好做
SELECT * FROM user_item_inventory
reather而不是
SELECT * FROM user_item WHERE type_id = 1