2010-08-29 104 views
3

一直在閱讀教程How to handle a Many-to-Many relationship with PHP and MySQLmysql多對多關係

在這個問題上我指的是哪些規定如下規則「數據庫架構」部分:

這個新表必須構建以 允許:

* 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:用戶表是從關係不同的數據庫(稱之爲友誼)。所以我不能使用外鍵。

+0

我已經發布了一個「澄清」的問題在這裏:http://stackoverflow.com/questions/3597078 – Poni 2010-08-29 23:54:37

回答

2

對於第一個問題:

  1. 兩個 列上創建一個唯一約束
  2. 確保你總是列進行排序。比確保 即a小於或等於 b

對於第二個問題,所以,如果你的表有 colummns ab

SELECT 
    * 
FROM 
    many_to_many_table 
WHERE 
    a = A or b = A 
+0

「獨特的約束」?對不起,但我不會說SQLish(你能解釋一下嗎?我知道外鍵 - 如果這就是你的意思,那麼不行,我不能這樣做,因爲這些ID來自一個完全不同的數據庫,有沒有解決方案?關於第2條 - 我也沒有承認這一點,只有第二個問題的答案是可以理解的,我感謝你的耐心和善意,真的,謝謝 – Poni 2010-08-29 23:21:02

+0

@Poni:你可以創建一個唯一的約束或者兩列的主鍵(查看staticsan的例子),下面是關於如何創建唯一約束的文檔:http://dev.mysql.com/doc/refman/5.1/en/ innodb-foreign-key-constraints.html 'alter table many_to_many_table add unique index(a,b);' – Wolph 2010-08-30 00:35:02

+0

兩列上的主鍵都會使得一對具有唯一性,但這對的另一個組合可能會添加,我不想要。1 <-> 2&2 <-> 1.第二個是不想要的。 – Poni 2010-08-30 00:52:10

0

好WoLpH增快,我基本上同意(請注意,您必須同時在兩個列上創建一個單個約束!)。只是爲了解釋爲什麼你碰到你提到的規則:通常,A和B是不同的表。因此,n:m關係的典型示例將允許條目(1,0)和(0,1),因爲它們會引用不同的對。有表A =表B是不同的情況(你使用A和B作爲用戶,但在這個例子中他們是表)。

+0

尼古拉斯感謝您的支持 - 對不起,如果我不理解你,或WoLpH。查看我對我的評論他的答案,我會appriciate更多信息的話! – Poni 2010-08-29 23:22:47

1

這聽起來像你想要一個複合主鍵。

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

這是你如何建立一個表,以便有永遠只能是一個一行AB定義表作爲相關。它可以工作,因爲主鍵必須在表中是唯一的,因此數據庫將只允許一行使用任何特定的值對。你可以創建不是主鍵的複合鍵,它們不必是唯一的(但你可以創建一個唯一的非主鍵,複合或不),但是你的規範要求一個主鍵,所以這就是我建議。

當然,您可以添加其他列來存儲有關此特定關係的信息。

+0

感謝您花時間回覆staticsan!那麼,你發佈的代碼並沒有達到它,但你的描述是我的目標。它怎麼不起作用?這是我用來創建表的確切代碼: CREATE TABLE IF NOT EXISTS'db_relations'.'tbl_relations'( 'id_a' INT UNSIGNED NOT NULL, 'id_b' INT UNSIGNED NOT NULL, PRIMARY KEY('id_a ','id_b')) ENGINE = InnoDB; – Poni 2010-08-29 23:38:19

+0

我假設您有兩種不同類型的對象,例如您對'表A'和'表B'的描述所建議的對象,如人員和郵寄地址。這意味着對'表A'的引用將總是*在'id_a'中,而對'表B'的引用將總是*在'id_b'中,否則將無意義。或者有用。 – staticsan 2010-08-30 03:12:55