2012-10-16 92 views
0

我正在設計一個數據庫,其中可以標記任何內容,我很可能希望能夠使用特定標記選擇所有內容。數據庫設計:多個連接表或具有標識「表」列的表格

我正在努力與以下兩個選項,並希望得到一些建議。如果有更好的方法,請讓我知道。

選項A
多個「多對多」連接表。

 
tag: 
    id 
    tag 

media: 
    id 
    title 
    src 
    creation 

media_tags: 
    id 
    media_id 
    tag_id 

article: 
    id 
    title 
    content 
    creation 

article_tags: 
    id 
    article_id 
    tag_id 

選項乙
單個「引用標記」表中,其使用一個「表」列,以確定加入到哪個表。

 
tag: 
    id 
    tag 

tag_reference: 
    id 
    row_id 
    tag_id 
    table 

media: 
    id 
    title 
    src 
    creation 

article: 
    id 
    title 
    content 
    creation 

從視圖選項B的維修點似乎是有利的,但考慮到SQL查詢來選擇所有內容,並且不認爲這是可能沒有多個查詢。

+0

我會去的第一個。將表格名稱存儲爲列不是一個好主意;恕我直言。 – hjpotter92

+1

看看這個:http://stackoverflow.com/questions/3579079/how-can-you-represent-inheritance-in-a-database。你的問題是繼承的一般問題的具體實例... –

回答

2

使用選項B時,不能將外鍵設置爲其他表。因此,我會與選項A和每個m:n關係一個表。

「從維修的角度來看選項B」 - 是一場噩夢。如果刪除一篇文章會發生什麼?所有與row_id行將堅持tag_reference表。您始終需要手動更新這些條目。

+0

感謝您的回答,它是完全有道理的。選項A獲勝者 –

0

其實,這取決於每個sql開發者。但我更喜歡Option A,因爲您可以很容易地知道某個表中的某一列是另一個表的foreign key,假設它是真的)。

Option B是有點不好的設計,因爲在列中存儲表名是壞主意。您可以在這裏花費更多IFCASE

0

第二個選項幾乎可以阻止您使用任何JOIN來獲得高效的SQL,從而迫使您使用慢速多重選擇。

所以我會說第一個選項是遠優於。

+0

當然,即使使用** Option B **中的佈局,仍然可以加入表格。也許效率不高,你必須每次傳遞表名作爲搜索參數。 – feeela

+0

僅當您事先知道要加入哪個表,或者加入SQL中所有可能的表時。 – Kickstart

相關問題