2017-05-26 75 views
-1

我們假設我有一個非常大的數據庫,裏面有大量的表。 某些這些表包含的數據集將被連接到彼此像MySQL數據庫規範化..一個表連接多個其他?

table: album 
table: artist 
--> connected by table: album_artist 

table: company 
table: product 
--> connected by table: company_product 

的表格album_artistcompany_product包含表示主鍵3列,ALBUMID/artistID同時companyID/...的productID

它是一個很好的做法,這樣做它是由像

--------------------------------------------------------- 
| id int(11) primary | leftID | assocType  | rightID | 
|---------------------------------------------------------| 
| 1     | 10  | company:product | 4  | 
| 2     | 6  | company:product | 5  | 
| 3     | 4  | album:artist | 10  | 
--------------------------------------------------------- 

的「assoc命令」表中,我不知道這是要走的路,或者有什麼比創建含多處別的e連接表?

+1

_然後一個戒指規則然後所有_ – RiggsFolly

+2

這聽起來對我來說是一個非常糟糕的主意。創建特定的連接表有什麼問題? – Uueerdo

+0

你說「如果這是要走的路」,但除了「像這樣的例子」之外沒有「this」,你沒有解釋「this」是什麼,或者你的例子是一個例子* of *請儘可能多地解釋你認爲你想做什麼以及爲什麼你認爲你應該這樣做。另外,您不清楚「創建多個連接表」的含義 - 是否要創建像「album_artist和company_product」這樣的表? (雖然再次,你沒有清楚地解釋這些是什麼。)請*解釋*,不要只用幾個字提醒你你的意思,但不是說。 – philipxy

回答

1

不,沒有,一千次沒有。不要超越你的多對多關係。保持簡單。試圖將所有關係整合到一張表中,沒有什麼可以獲得,並且會失去很多。

如果你有很多之間一對多的關係,說guiaristdrummer,那麼你需要一個guitarist_drummer錶帶有兩個列:guitarist_iddrummer_id。該表的主鍵應由兩列組成。而且你應該有相反順序的兩列組成的另一個索引。不要將具有自動添加ID的第三列添加到這些連接表中。這太浪費了,它允許在這些表格中使用重複的對,這通常是令人困惑的。

在學校參加RDBMS班的人會立即認識到這些表的作用。這很好,因爲這意味着你不必成爲這個項目中唯一的程序員。

專業提示:隨處使用相同的列名。使您的guitarist表包含名爲guitarist_id而不是id的主鍵。它使你的關係表更易於理解。而且,如果你使用了像Sql Developer這樣的反向工程工具,那麼這個工具將會讓你的模式更容易。

4

不,這不是一個好習慣。這是一種可怕的做法,因爲參照完整性就會消失。參照完整性是RDBMS提供的保證,即一行中的外鍵引用另一個表中的有效行。爲了使數據庫能夠強制引用完整性,每個引用列必須引用一個且僅有的一個引用表中的一個引用列。

+0

@philipxy恐怕我不明白你想說什麼。你能說出其他地方嗎?你會怎麼說句子呢? –

+1

我同意對於給定的FK,「每個引用的列必須引用一個且只有一個引用的列中的一個並且只有一個引用表」。我錯誤地認爲應該爲引用列聲明一些FK(s)。 – philipxy

0

答案是它「依賴於」情況。在你的情況和大多數其他人,不,這是沒有意義的。如果你正在做很多關係,那麼這個約束可以通過帶有外鍵的鏈接表和一個唯一約束來強制執行。如果你有很多表格指向單個表格,最好的用例可能是。每個表都可以有一個帶有索引的鏈接表。如果其中一個表是一個大表,並且您需要單獨獲取鏈接的記錄,這將是有益的。