您如何处理多种类型的相同多对多关系?

时间:2016-01-11 22:35:57

标签: php mysql database

我想知道在同一个表之间建立多个多对多关系时是否有最佳做法。

目前,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 | 
-------------------------------    ------------------

2 个答案:

答案 0 :(得分:2)

虽然决定最终取决于概念上不同的库存和愿望清单,但根据以往的经验,我建议使用单独的表格。

目前,您没有附加到广告资源或关注列表的其他数据,但未来情况不一定如此。如果不了解有关广告资源和关注列表的更多详细信息,则很难进行预测,但只要您想开始跟踪inventory关系与watchlist关系的其他数据,就会生成单独的表格事情很多更简单。只要您想添加属于您的某种关联类型的列,您就会想要单独的表格。

正如在另一个答案中指出的那样,从纯数据存储和检索的角度来看,拥有单独的表肯定更快:你可以减少一个列/索引来填充/过滤。如果您的库存/心愿单关联表变得“大”,那些额外的type_id引用将开始累加到重要的东西。 (对于较小的大小,这无关紧要,但除了明显的磁盘存储因素外,更多数据需要更多内存和更多缓存来管理,尤其是涉及索引时。)

如果您需要知道所有用户感兴趣的项目(库存,监视列表以及您可能创建的任何其他类似表格的组合),则单独的表格将是复杂的,但是如果这是一个实际需要,然后您可以使用所有表上的UNION查询轻松生成该列表。 (如果需要,您甚至可以创建另一个包含所有用户 - 项目引用副本的表作为性能增强。)

答案 1 :(得分:0)

它取决于您希望如何使用这些数据。如果它们在逻辑上是分开的并且它们之间没有相关性,那么您可以使用两个表。 如果您要显示库存和监视列表记录,在某些模块中,并且您只想区分记录类型,那么您可以使用一个记录类型的表。

很明显,对于数据库引擎,最好做

SELECT * FROM user_item_inventory

reather而不是

SELECT * FROM user_item WHERE type_id = 1