php - 如何处理同一多对多关系的多种类型?

标签 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 | 
-------------------------------    ------------------

最佳答案

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

目前,您没有向库存或关注列表附加任何其他数据,但将来不一定会出现这种情况。如果不了解有关库存和监视列表的更多详细信息,就很难做出预测,但一旦您想开始跟踪库存关系与监视列表关系的其他数据,拥有单独的表将使事情变得更加简单。一旦您想要添加属于您的一种关联类型的列,您就会需要单独的表。

正如另一个答案中所指出的,从纯粹的数据存储和检索的角度来看,拥有单独的表肯定会更快:您将少一个用于填充/过滤的列/索引。如果您的库存/愿望 list 关联表变得“大”,那些额外的 type_id 引用将开始累积起来,变得非常重要。 (较小的尺寸并不重要,但除了明显的磁盘存储因素之外,更多的数据需要更多的内存和更多的缓存来管理,特别是当涉及到索引时。)

如果您需要了解用户感兴趣的所有项目(库存、监视列表以及您可能创建的任何其他类似表的组合),那么单独的表将会变得复杂,但是如果这是实际需要,那么您可以通过对所有表进行 UNION 查询轻松生成该列表。 (如果需要,您甚至可以创建另一个包含所有用户项引用的副本的表,以增强性能。)

关于php - 如何处理同一多对多关系的多种类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34732416/

相关文章:

mysql - mysql 连接 ID 是否总是递增,即使较低的连接已终止?

sql - 比较两个表中的两个选择

php - MYSQL:一组中varchar y:m:d的平均值

javascript - Stripe AJAX PHP 和 JavaScript

php内存多少太多了

MySQL 存储过程 : How to declare a Cursor for a Select from a temporary table?

php - 正则表达式(preg_match)匹配任何东西

php - 关于 MySQL/PHP 中事务(或表锁?)的问题

php - 我需要使用什么mysql代码?查找日期之间创建的所有 ID

php - 查询并显示mysql搜索结果