2011-01-24 80 views
1

我有這個alogirthm問題​​,在創建MySQL表而言,讓我解釋一下情景:處理表格的困境?

我有一個帖子表:

Posts{id, user_id,image,tag,date} 

每個崗位只能對標籤!只有

我需要另一個表來存儲標籤!我可以理解,如果每個帖子都有多個標籤,則必須創建另一個表來存儲標籤!但這是唯一的一個!

如果我想獲得所有標記「狗」的職位,我會用:

select all posts where tag=DOG 

你覺得這是錯還是不好呢?我很困惑!

回答

3

如果系統中的帖子確實只需要有一個標籤,那麼在技術上您可以將標籤放在帖子記錄上。但是,您不應該這樣做:例如,如果您有250000條有關狗的帖子,並決定將「狗」標籤重命名爲「犬」,會發生什麼情況?

一個更好的主意是創建一個Tag表並在Post表上放置一個外鍵。例如:

Post{post_id, user_id, image, tag_id, date} 
Tag{tag_id, description} 

但是爲了以防萬一你真的面臨,總有一天,與其中後可以有多個標籤的情景......

然後你描述的模型其中PostsTags存在於所謂的Many-to-Many relationship中:給定標籤可以與任意數量的帖子相關聯,並且給定帖子可以與任意數量的標籤相關聯。

現在,您不僅需要一個單獨的表格作爲標籤,而且還需要一個關係表格來將帖子與標籤相關聯。例如:

Post{post_id, user_id, image, date} 
Tag{tag_id, description} 

Post_Tag{post_id, tag_id} 

你會再選擇用「狗」標籤的所有帖子,像這樣:

SELECT p.* 
FROM Post p 
JOIN Post_Tag pt ON pt.post_id = p.post_id 
JOIN Tag t ON pt.tag_id = t.tag_id 
WHERE t.description = 'Dog' 
+0

我明白你的意思,並感謝你的回答,但一篇文章只能與一個標籤關聯!謝謝你的更新。標籤有一個實際的活動大聲笑,你不能同時在兩個不同的事件,你可以! – pingpong

+0

@pingpong我已經更新了我的答案,包括任何一種情況。我仍然認爲你可以將標籤分離到自己的表中,即使帖子只能有一個。如果你有一天決定標籤應該有與之相關的另一條數據,比如父母標籤(例如寵物狗),會發生什麼?規範化的勝利。 :) –

+0

你真的這實際上是非常真實的!我想我會創建另一張桌子! +1我 – pingpong

1

djacobson是正確的,當他說你需要設計爲未來可能出現的情況。如果可能,請始終嘗試將表格保持爲一對多。但是,對於您的情況,如果您確實知道每個帖子永遠不會有多個標籤,則可以使用單個表格。使用一個表格顯然會減少數據庫的大小,並簡化查詢。但是,如果您發現可能有帖子沒有任何標籤,那麼您將面臨在表中存在大量NULL值的風險,這也應該避免。如前所述,在Post和Tag表之間使用One-to-One關係更好,或者更好的是使用One-to-Many關係。