我想知道在同一表之间建立多个多对多关系是否有最佳实践。
目前,对于用户创建的项目,我在 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 |
------------------------------- ------------------
最佳答案
虽然决定最终取决于库存和心愿单在概念上的不同程度,但根据之前的经验,我建议使用单独的表格。
目前,您没有向库存或关注列表附加任何其他数据,但将来不一定会出现这种情况。如果不了解有关库存和监视列表的更多详细信息,就很难做出预测,但一旦您想开始跟踪库存
关系与监视列表
关系的其他数据,拥有单独的表将使事情变得更加简单。一旦您想要添加仅属于您的一种关联类型的列,您就会需要单独的表。
正如另一个答案中所指出的,从纯粹的数据存储和检索的角度来看,拥有单独的表肯定会更快:您将少一个用于填充/过滤的列/索引。如果您的库存/愿望 list 关联表变得“大”,那些额外的 type_id
引用将开始累积起来,变得非常重要。 (较小的尺寸并不重要,但除了明显的磁盘存储因素之外,更多的数据需要更多的内存和更多的缓存来管理,特别是当涉及到索引时。)
如果您需要了解用户感兴趣的所有项目(库存、监视列表以及您可能创建的任何其他类似表的组合),那么单独的表将会变得复杂,但是如果这是实际需要,那么您可以通过对所有表进行 UNION 查询轻松生成该列表。 (如果需要,您甚至可以创建另一个包含所有用户项引用的副本的表,以增强性能。)
关于php - 如何处理同一多对多关系的多种类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34732416/