2014-02-09 55 views
-1

我想解釋一個連接表給同事的好處,下面是一個解釋。我對麼?連接表的好處?

目前,他有一個圖片和標籤與兩個表之間的關係。圖片表和標籤表。圖表有一個tag_id這是FK到標籤表中的條目。這是我的迴應:

首先讓我們看看picstags表。因此,在您當前的體系結構中,可以想象兩張圖片(a & b)。我們用標籤#wtf標記圖片& b。現在,我們在出tags表兩個條目:

pic_id title 
------ ----- 
a  wtf 
b  wtf 

你看到的問題?所以想象一下,在1000張不同的照片上有1000個wtf標籤。有了這個相同的體系結構,我們現在有一個包含所有這些重複數據(和浪費的空間)的臃腫標籤表。當我們有多對多的關係時會出現這個問題。在這種情況下,許多照片可以有很多標籤,許多標籤可以有很多照片。我們如何解決這個問題?答案是一個連接表。所以我們創建一個新表格。我們稱之爲pic_tag。該表格將具有列pic_id & tag_id。所以現在新表將如下所示:

pic_tag

pic_id tag_id 
------ ------ 
a  1 
b  1 

標籤

id name 
-- ---- 
1 wtf 

PIC

id name 
-- ---- 
a pic1 
b pic2 

所以這做了幾件事情對我們來說。首先它節省了空間。我們只存儲一次字符串'wtf'。其次,要找到所有帶有'wtf'標籤的圖片,我們首先訪問標籤表並找到'wtf'的標識,然後轉到pic_tag表並搜索該標識,這樣可以更有效地搜索臃腫的標籤'給定文本的表格。換言之,搜索整數比搜索文本要快得多。

+0

沒有數據複製,數據的完整性是優點,性能較低是一個騙局。 –

+0

@ AD.Net:「性能下降」 - 這只是錯誤的。你不能說你的數據規範化會使得*東西*變慢,這是因爲沒有抽象*性能*度量,而是不同性能方面的數量,對於給定的結構可能*好得多* – zerkms

回答

3

主要好處是有隻能用連接表建模的關係。假設你有兩個實體A和B.如果關係A:B是1:1,那麼這兩個可以用一個表來表示。如果A:B是1:N(例如1個客戶可以有N個訂單,但每個訂單僅來自一個客戶),那麼您可以將此模型作爲從訂單表到客戶表的外鍵。但是如果A:B是N:M(你的標籤場景就是一個很好的例子),你需要一種方法來爲每張圖片表示0,1或者N個標籤。除了連接表之外,沒有聲音關係表示。

請注意,您可以爲每張圖片呈現多個標籤,同時在一列中突破關係設計的一些原則(如存儲多個標籤或FK到標籤)。是否做到這一點是一個設計決定。其他好處:您可以在不更改核心數據模型的情況下改變關係是否爲0:1,0:N,1:(0-5),1:N等的關係 - 在觸發器中尋址該邏輯或應用程序邏輯。您可以創建其他索引來幫助連接。您可以引入更多的唯一性約束來執行數據邏輯等。

但是,主要的好處是,連接表是模型化某些類型關係的唯一關係良好的方式。