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