我有這個alogirthm問題,在創建MySQL表而言,讓我解釋一下情景:處理表格的困境?
我有一個帖子表:
Posts{id, user_id,image,tag,date}
每個崗位只能對標籤!只有
我需要另一個表來存儲標籤!我可以理解,如果每個帖子都有多個標籤,則必須創建另一個表來存儲標籤!但這是唯一的一個!
即
如果我想獲得所有標記「狗」的職位,我會用:
select all posts where tag=DOG
你覺得這是錯還是不好呢?我很困惑!
我有這個alogirthm問題,在創建MySQL表而言,讓我解釋一下情景:處理表格的困境?
我有一個帖子表:
Posts{id, user_id,image,tag,date}
每個崗位只能對標籤!只有
我需要另一個表來存儲標籤!我可以理解,如果每個帖子都有多個標籤,則必須創建另一個表來存儲標籤!但這是唯一的一個!
即
如果我想獲得所有標記「狗」的職位,我會用:
select all posts where tag=DOG
你覺得這是錯還是不好呢?我很困惑!
如果系統中的帖子確實只需要有一個標籤,那麼在技術上您可以將標籤放在帖子記錄上。但是,您不應該這樣做:例如,如果您有250000條有關狗的帖子,並決定將「狗」標籤重命名爲「犬」,會發生什麼情況?
一個更好的主意是創建一個Tag表並在Post表上放置一個外鍵。例如:
Post{post_id, user_id, image, tag_id, date}
Tag{tag_id, description}
但是爲了以防萬一你真的面臨,總有一天,與其中後可以有多個標籤的情景......
然後你描述的模型其中Posts
和Tags
存在於所謂的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'
djacobson是正確的,當他說你需要設計爲未來可能出現的情況。如果可能,請始終嘗試將表格保持爲一對多。但是,對於您的情況,如果您確實知道每個帖子永遠不會有多個標籤,則可以使用單個表格。使用一個表格顯然會減少數據庫的大小,並簡化查詢。但是,如果您發現可能有帖子沒有任何標籤,那麼您將面臨在表中存在大量NULL值的風險,這也應該避免。如前所述,在Post和Tag表之間使用One-to-One關係更好,或者更好的是使用One-to-Many關係。
我明白你的意思,並感謝你的回答,但一篇文章只能與一個標籤關聯!謝謝你的更新。標籤有一個實際的活動大聲笑,你不能同時在兩個不同的事件,你可以! – pingpong
@pingpong我已經更新了我的答案,包括任何一種情況。我仍然認爲你可以將標籤分離到自己的表中,即使帖子只能有一個。如果你有一天決定標籤應該有與之相關的另一條數據,比如父母標籤(例如寵物狗),會發生什麼?規範化的勝利。 :) –
你真的這實際上是非常真實的!我想我會創建另一張桌子! +1我 – pingpong