代码之家  ›  专栏  ›  技术社区  ›  Poni

mysql多对多关系

  •  3
  • Poni  · 技术社区  · 14 年前

    一直在阅读教程 How to handle a Many-to-Many relationship with PHP and MySQL .

    在这个问题中,我参考了“数据库模式”部分,其中说明了以下规则:

    此新表必须构造为 允许以下操作:

    * It must have a column which links back to table 'A'.
    * It must have a column which links back to table 'B'.
    * It must allow no more than one row to exist for any combination of rows from table 'A' and table 'B'.
    * It must have a primary key.
    

    现在已经很清楚了。

    我唯一的问题是第三条规则(“必须允许 任何组合都不存在多行 “”。
    我也希望这个应用,但它似乎不是这样工作的。

    在我的mysql(5.xx)测试实例中,我可以添加两行来反映相同的关系!

    例如,如果我建立这个关系(通过添加一行):
    甲至乙
    它还允许我建立这种关系:
    B到A

    所以问题实际上是两个问题:

    1) 如何执行第三条不允许执行的规则? ?不管组合如何,只有一个唯一的关系。

    2)我什么时候想 搜索“a”的所有关系,SQL查询的外观如何 ?

    注1:基本上,我的最终目标是创建一个“友谊”系统,据我所知,解决方案是多对多表。如果可能的话,建议其他的。

    注释2: 用户表与关系位于不同的数据库上 (称之为友谊) 桌子 . 因此,我不能使用外国钥匙。

    3 回复  |  直到 14 年前
        1
  •  2
  •   Wolph    14 年前

    对于第一个问题:

    1. 对两者都创建唯一约束 柱
    2. 确保总是对列进行排序。所以如果你的桌子上有 哥伦布 a b 比确定 那个 小于或等于

    对于第二个问题:

    SELECT
      *
    FROM
      many_to_many_table
    WHERE
      a = A or b = A
    
        2
  •  1
  •   staticsan    14 年前

    听起来您需要一个复合主键。

    CREATE TABLE relationship (
         A_id INTEGER UNSIGNED NOT NULL,
         B_id INTEGER UNSIGNED NOT NULL,
         PRIMARY KEY (A_id, B_id)
    );
    

    这是如何设置表,以便只有一行定义表 A B 相关。因为主键在表中必须是唯一的,所以数据库将只允许一行具有任何特定的值对。您可以创建不是主键的复合键,它们不必是唯一的(但是您可以创建一个唯一的非主键,复合键或非主键),但是您的规范请求了一个主键,所以这是我建议的。

    当然,您可以添加其他列来存储有关此特定关系的信息。

        3
  •  0
  •   Nicolas78    14 年前

    好的,沃尔夫更快,我基本同意(注意你必须创造一个 单一的 同时约束两列!)为了解释为什么你会与你提到的规则相冲突:通常,A和B是不同的表。因此,n:m关系的典型示例允许条目(1,0)和(0,1),因为它们引用的是不同的对。表A=表B是另一种情况(您使用A和B作为用户,但在示例中它们是表)。