我想知道在同一个表之间有多个多对多关系时是否有最佳实践。
目前,对于用户创建的项,我在useritem之间有多对多的关系。

---------------------
| user_id | item_id |
---------------------
| 1       | 3       |
---------------------

我想为useritem创建另一个连接表,以引用它们的观察列表。我应该创建单独的多对多表吗?
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/

10-11 03:31
查看更多