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

Php 您如何处理相同多对多关系的多种类型?,php,mysql,database,Php,Mysql,Database,我想知道在同一个表之间建立多对多关系时是否有最佳实践 目前,对于用户创建的项目,user和item之间存在多对多关系 --------------------- | user_id | item_id | --------------------- | 1 | 3 | --------------------- 我想为用户和项目创建另一个连接表,以引用他们的观察列表。我应该创建单独的多对多表吗 user_item_inventory user_item_wat

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

目前,对于用户创建的项目,
user
item
之间存在多对多关系

---------------------
| user_id | item_id |
---------------------
| 1       | 3       |
---------------------
我想为
用户
项目
创建另一个连接表,以引用他们的观察列表。我应该创建单独的多对多表吗

user_item_inventory      user_item_watchlist
---------------------    ---------------------
| user_id | item_id |    | user_id | item_id |
---------------------    ---------------------
| 1       | 3       |    | 2       | 3       |
---------------------    ---------------------
或者我应该创建一个多对多表,该表与
user\u item\u type
表具有多对一关系

user_item                          user_item_type
-------------------------------    ------------------
| user_id | item_id | type_id |    | id | name      |
-------------------------------    ------------------
| 1       | 3       | 1       |    | 3  | inventory | 
-------------------------------    ------------------
| 2       | 3       | 2       |    | 2  | watchlist | 
-------------------------------    ------------------

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

很明显,对于数据库引擎,这样做更好

SELECT * FROM user_item_inventory

SELECT * FROM user_item WHERE type_id = 1

虽然最终的决定取决于库存和愿望清单在概念上的不同程度,但基于之前的经验,我建议使用单独的表格

目前,您没有附加到库存或观察列表的其他数据,但将来不一定如此。如果不了解有关库存和观察列表的更多详细信息,就很难做出预测,但是只要您想开始跟踪
库存
关系与
观察列表
关系上的其他数据,使用单独的表将使事情变得更简单。只要您想添加只属于您的一种关联类型的列,您就需要有单独的表

正如在另一个答案中指出的那样,从纯数据存储和检索的角度来看,使用单独的表肯定更快:您将少一个要填充/筛选的列/索引。如果您的库存/愿望列表关联表变得“大”,那么这些额外的
type\u id
引用将开始增加一些重要内容。(对于较小的大小来说无关紧要,但除了明显的磁盘存储因素外,更多的数据需要更多的内存和更多的缓存来管理,特别是在涉及索引的情况下。)


如果您需要知道用户感兴趣的所有项目(库存、观察列表和您可能创建的任何其他类似表的组合),那么单独的表将是一个复杂的问题,但是如果这是一个实际需要,那么您可以通过对所有表的
UNION
查询轻松地生成该列表。(如有必要,您甚至可以创建另一个包含所有用户项引用副本的表作为性能增强。)

我将创建单独的多对多表,然后,如果我需要两个列表中的项,请使用“选择不同的并集”。我认为这可能取决于用户项是否趋向于增长。如果趋向于增长,您可能希望将其分离。您的第一点非常好,将来可能会有更多数据以该特定关系类型存储。从这个意义上讲,拥有单独的表格更能证明未来。