2010-12-21 35 views
9

我想用php和mysql創建一個簡單的標籤系統,這樣用戶可以通過表單添加一些標籤。我的問題是,我應該將標籤保存爲單個數據庫列中的數組嗎?例如。 「tag1,tag2,tag3」..或者我應該在數據庫表中有單獨的列,我應該在每列中保存每個標籤。 我希望我的問題很清楚。 謝謝。如何在數據庫中保存標籤(關鍵字)?

回答

20

我可能不會說。在標籤和被標籤對象之間使用多對多的關係。舉例來說,如果被標記的東西是一個問題,表看起來是這樣的:

Question: 
    QuestionId 
    Title 
    Body 

Tag: 
    TagId 
    Name 

QuestionTags: 
    QuestionId 
    TagId 
+3

這種方式提供可擴展性並允許使用索引進行數據庫優化。好答案。 – 2010-12-21 14:14:24

+0

我登陸此頁面搜索關於在此類方案中更新標籤列表的建議。你會怎麼做? DELETE FROM QuestionTags WHERE QuestionId = 123然後INSERT INTO QuestionTags所有剩下的和新的標籤?這對開發者來說似乎是最簡單的,但對性能來說可能不是最好的... – Henno 2012-07-04 18:05:58

+0

@Henno我不知道我明白你的意思。你可以問一個單獨的問題嗎? – 2012-07-05 08:05:36

0

你可以使用序列化並unserialise的關鍵字存儲在一個領域。這裏更多的信息 http://php.net/manual/en/function.serialize.php

事情是這樣的......

$keywords = array('apple', 'pear', 'banana', 'peach'); 
$keywords_serialized = serialize($keywords); 
$sql = INSERT INTO dbtable (keywords) VALUES ($keywords_serialized); 
8

今天跨越這個問題來了,以及與聚集在這裏的一些想法,雖然問題不是很新的,我會離開我解決方案以及:

我認爲答案克勞斯Byskov霍夫曼給了不錯,但我會添加,並將標記列表存儲爲像他說的多對多表,但也作爲序列化的字符串以某種形式(通過像user466764說的序列化,或者像你自己說的逗號分開的事情,這可以與我一起處理mplode/explode)在主表中。

是啊,我知道:存儲相同的數據兩次不能很好地與許多數據庫的完美主義者接受,因爲它擔負着越來越不一致的危險,但我會爲性能和簡單做到這樣:

多對多表(標籤表)僅用於搜索。爲了提高搜索性能,我只限於訪問該表以進行搜索(當然,我們需要在編輯標籤時對其進行更新),但從不查詢它僅用於在某處查看/列出標籤。並且序列化標籤列表適用於查看相關文章或項目的每個地方 - 當顯示該項目時,表格已經存在,每當您想要顯示該頁面時再對標籤表格進行查詢在主表中已經有了列表時,這是不必要的。確保在更新標籤時要小心,以便始終在兩個地方更新它們,最好通過一個既執行兩者的setter函數,也不應存在不一致的問題。