簡體   English   中英

如何為具有多對多關系的2個MySQL表創建默認關系?

[英]How to create default relationship for 2 MySQL tables with many-to-many relationships?

在MySQL中,我有2個表AB ,具有多對多關系。 我有一個數據透視表A_B ,用於表A和B之間的關系。

在表A中,有些行我想鏈接到table B *ALL* (包括當前和將來)行。 例如,假設table B當前有5行。 table A A2行鏈接到table B所有5行。 將來,當將新行添加到table B ,我希望將行A2自動鏈接到table B 所有這些新行。

目前,我正在考慮使用MySQL觸發器添加此功能。 但是我不確定這是否是正確的方法。

或者我應該在table A添加一個新列,並將其用作默認關系的指示符? 然后,在我的編程代碼中,我可以檢查列值, table A中的行是否與table B所有行都有關系。

數據透視表

用關系數據庫術語來說,這是一個關聯表。

您所需要的是,使Table_A中的指定行與Table_B中的所有行相關; 其余的通過Table_A_B關聯。 偉大的EF Codd博士要求我們從集合的角度來考慮數據。 Table_A中有兩組。 我們將第一組稱為All_B,將第二組稱為Specific_B,其中Table_A_B標識了特定的關系。

因此,這不是“默認”關系,而是基於子類型的兩個單獨的關系。

您不需要您描述的“默認”關系。 這將導致大量行不起作用,因為Table_B中的All_B行是已知的,因此不需要存儲它們。

您不需要觸發器(每當插入All_B行時都需要繼續插入Table_A_B行)。 丑陋如罪。

正確的方法是使用為集合命名的互斥子類型,其中:

  • Specific_B通過Table_A_B與Table_B相關

  • Table_A本身和All_B沒有任何關系。

您的代碼可以確定任何Table_A行是哪個子類型,並相應地加入Table_B:

  • 通過Table_A_B用於Specific_B

  • 所有All_B的笛卡爾乘積Table_A :: Table_B。

圖片

典型的異或門•表關系圖

Exclusive子類型需要在Basetype中的Discriminator列。

如果您不想打擾完整的關系完整性,那么可以肯定,Table_A中的“指標”列就足夠了。 那就是Table_A中的Discriminator列,減去Subtypes。

對評論的回應

這是我第一次了解互斥子類型的概念。 現在我知道如何解決問題了

在這種情況下,請閱讀有關子類型的文檔。 鏈接包括您將需要的代碼,以使完整性為聲明性。 如果您想進行全面討論,尤其是希望自己免受被聲稱是理論家,兜售瘋狂方法以實施“正直”的馬戲團怪人的誘惑,請閱讀此答案。

我認為使用database triggers是執行所需操作的最合適方法,因為它可以保護數據庫與程序的independence ,並且數據庫本身是完整的。

但是也許您考慮使用Grouping concept因為它在用戶帳戶管理數據庫中使用。 您可以創建一個組,例如admins,並將表B的所有記錄與其相關聯,並且僅將A的記錄分配給該組。

暫無
暫無

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

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