簡體   English   中英

mysql有很多很多關系

[英]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表與關系 (稱為友誼) 位於不同的數據庫 因此我不能使用外鍵。

對於第一個問題:

  1. 在兩列上創建唯一約束
  2. 確保始終對列進行排序。 因此,如果您的表具有colummns ab ,則確保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)
);

這是您設置表的方式,以便只能有一行將表AB定義為相關。 它的工作原理是因為主鍵必須在表中是唯一的,因此數據庫只允許一行具有任何特定的值對。 您可以創建不是主鍵的復合鍵,它們不必是唯一的(但您可以創建唯一的非主鍵,復合或不復合),但您的規范要求主鍵,這就是我的意思建議。

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM