【问题标题】:Best way to handle Many-to-Many relationships in PHP MySQL在 PHP MySQL 中处理多对多关系的最佳方法
【发布时间】:2010-04-28 12:28:15
【问题描述】:

我正在寻找在 PHP 和 MySQL 中处理多对多关系数据库的最佳方法。

现在我有 2 张桌子:

用户(id、user_name、first_name、last_name)
连接(id_1,id_2)

User 表中,id 在添加时自动递增,user_name 是唯一的,但可以更改。不幸的是,我无法控制user_name 及其被更改的能力,但我必须考虑到这一点。

Connections表显然是user1和user2的id。

连接表需要考虑这些可能的关系:

user1 --> user2 (user 1 friends with user 2 but not user2 friends with user1) 
user2 --> user1 (user 2 friends with user 1 but not user1 friends with user2) 
user1 <--> user2 (user 1 and user 2 mutually friends) 
user1 <-!-> user2 (user 1 and user 2 not friends) 

那部分不是问题,我遇到的问题是在它们成批变化时保持这些关系的唯一性。

可能的解决方案 1:删除所有用户 1 的关系并使用更新的列表读取它们。我认为这对于我的需求来说可能太慢了。

解决方案 2?还有其他人遇到这个问题吗?我应该如何最好地处理这个问题?

更新:区分关系:

我处理这样的关系:

user1, user2
user1, user3
user2, user1

在该示例中,以下情况属实:
user1 跟随 user2 和 user3
user2 只关注 user1 但不关注 user3
user3 不关注 user1 或 user2

【问题讨论】:

  • 不确定这是否与您的问题有关,但如果您的 Connections 表中唯一的内容是两个用户 ID,您如何区分不同类型的关系?
  • @ender,我用你的问题的答案更新了这个问题。
  • @simplemotives,我正在使用关联实体来创建多对多关系,这就是为什么我有一个 users 表和一个 connections 表。

标签: php mysql many-to-many


【解决方案1】:

如果您遇到唯一性问题,您可以在 Connections 上使用复合主键,同时使用两列 (id_1, id_2)。

【讨论】:

  • 如果 Connections 表上没有主键,则应添加一个。您可能熟悉选择单个列作为主键索引,知道它必须是唯一的。但是,您可以将多个列用于索引。即使可能有重复的 id_1 值,也不应该有任何重复的 Connections 表行(其中 id_1 和 id_2 相同),因此在主键索引中将两个列命名为 id_1 和 id_2。然后,数据库将不允许您有重复。
  • ALTER TABLE Connections DROP PRIMARY KEY, ADD PRIMARY KEY(id_1, id_2);
猜你喜欢
  • 1970-01-01
  • 2016-08-08
  • 2011-03-10
  • 1970-01-01
  • 2021-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多