[英]mysql many to many relationship
正在閱讀教程如何處理與PHP和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.
到目前為止它已經非常清晰了。
我遇到的唯一問題是第3條規則(“ 任何組合必須允許不超過一行 ”)。
我希望這也適用,但似乎沒有這種方式。
在我的mysql(5.XX)測試實例上,我可以添加兩行反映相同關系的行!
例如,如果我建立這種關系(通過添加一行):
A到B.
它也允許我建立這種關系:
B到A.
所以問題實際上是兩個問題:
1) 如何制定不允許執行上述操作的第3條規則 ? 無論組合如何,只有一個獨特的關系。
2)當我想要搜索'A'的所有關系時,SQL查詢將如何顯示 ?
注意#1:基本上我的最終目標是創建一個“友誼”系統,據我所知,解決方案是一個多對多表。 如果可能,建議其他方式。
注意#2: users表與關系 (稱為友誼) 表 位於不同的數據庫 中 。 因此我不能使用外鍵。
對於第一個問題:
a
和b
,則確保a
小於或等於b
對於第二個問題:
SELECT
*
FROM
many_to_many_table
WHERE
a = A or b = A
聽起來你想要一個復合主鍵。
CREATE TABLE relationship (
A_id INTEGER UNSIGNED NOT NULL,
B_id INTEGER UNSIGNED NOT NULL,
PRIMARY KEY (A_id, B_id)
);
這是您設置表的方式,以便只能有一行將表A
和B
定義為相關。 它的工作原理是因為主鍵必須在表中是唯一的,因此數據庫只允許一行具有任何特定的值對。 您可以創建不是主鍵的復合鍵,它們不必是唯一的(但您可以創建唯一的非主鍵,復合或不復合),但您的規范要求主鍵,這就是我的意思建議。
當然,您可以添加其他列來存儲有關此特定關系的信息。
好吧WoLpH增快,我基本同意(請注意,你必須創建在同一時間兩列一個約束!)。 只是為了解釋為什么你會碰到你提到的規則:通常,A和B是不同的表格。 因此,n:m關系的典型示例將允許條目(1,0)和(0,1),因為它們將引用不同的對。 表A =表B是不同的情況(您使用A和B作為用戶,但在示例中它們是表)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.