3

一直在阅读教程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) 测试实例上,我可以添加反映相同关系的两行!

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

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

1)我如何执行不允许执行上述操作的第三条规则?无论组合如何,都只有一个唯一关系。

2) 当我想搜索“A”的所有关系时,SQL 查询会是什么样子

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

注意#2:用户表与关系(称为友谊)位于不同的数据库中。因此我不能使用外键。

4

3 回答 3

2

对于第一个问题:

  1. 在两列上创建唯一约束
  2. 确保始终对列进行排序。因此,如果您的表有列a并且b比确保a小于或等于 b

对于第二个问题:

SELECT
  *
FROM
  many_to_many_table
WHERE
  a = A or b = A
于 2010-08-29T23:07:53.523 回答
1

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

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

这就是您设置表格的方式,以便只能有一行定义表格AB与之相关。它之所以有效,是因为主键在表中必须是唯一的,因此数据库将只允许一行具有任何特定的值对。您可以创建不是主键并且它们不必是唯一的复合键(但您可以创建一个唯一的非主键,复合与否),但是您的规范要求一个主键,所以这就是我建议。

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

于 2010-08-29T23:29:41.243 回答
0

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

于 2010-08-29T23:20:32.323 回答