2010-07-08 29 views
0

我正在構建一個系統,用於存儲對文章進行分類的文章和標籤。標準的東西,類似於這個網站的做法。現在我的問題是,我是否應該將標籤存儲在僅包含標籤和文章ID的單獨表格中,或者將標籤存儲在文章表格的額外列中。我的第一個直覺是規範化數據庫,並有兩個表。問題在於用戶管理標籤的接口是一個簡單的文本框,所有標籤都以逗號分隔。因此,當用戶提交他的更改時,爲了找出添加,更改或減去哪些標籤,我需要先查詢數據庫,將結果與標籤基礎上的新數據進行比較,然後相應地處理這些更改。與簡單地更新文章表格的一行中提交的文件相比,具有巨大開銷的過程。你會怎麼做,或者有沒有第三個選項我沒有考慮?用文章和標籤規範化數據庫的正確策略是什麼?

PD。我被困在這個項目的關係數據庫中。

+0

簡單的字符串比較只有在標籤始終以相同的順序輸入時纔有效。無論如何,你必須在標籤的基礎上進行比較。 – Rene 2010-07-08 09:32:54

+0

我可以使用LIKE語句。 – 2010-07-08 10:08:39

+0

但這將是一個可怕的和低效率的黑客攻擊。 – Yellowfog 2010-07-08 10:14:32

回答

0

您需要對數據庫進行規範化處理,以便運行查詢,例如'查找帶有標記T的所有文章'。

假設您已經應用了正確的索引,我認爲在抓取所有標籤以將其與新標籤進行比較時,實際上並沒有太多開銷。

就我個人而言,我不會刪除所有標籤,然後插入所有新標籤,因爲我可能希望在輸入單個標籤時執行審覈等操作。

如果您使用的是SQL Server 2008,那麼我建議您查看MERGE命令。

+0

我正在使用SQL Server Compact,因此沒有MERGE命令。至少沒有我能找到。 – 2010-07-08 10:00:28

+0

我想你必須爲每種情況編寫單獨的插入,更新和刪除語句。請注意,如果你將它們包裝在一個事務中,那麼你會得到原子性。 – Yellowfog 2010-07-08 10:13:47

1

如果您使用的是單獨的表格,而不是試圖找出哪些標籤每次都發生了變化,只需刪除給定文章ID的全部內容,然後插入所有提供的標籤 - 這應該會帶來很少的開銷。

在標記系統中,通常最重要的性能是檢索標記和/或檢索相關內容。在一個項目可以有任意數量的標籤的情況下,使用帶有索引標籤列的單獨表格應該提供非常快速的查找。

+0

我曾考慮過它,但我沒有辦法保證操作的原子性,如果在刪除標籤後出現問題,我將留下未歸類的文章。除此之外,我還想跟蹤哪些標籤是新的,哪些是刪除的。 – 2010-07-08 09:46:37

+0

這仍然不應該帶來太多開銷,事實上,如果在單個列中使用單獨的表而不是字符串比較,應該更容易計算出來。這樣做的關鍵是優化信息檢索,因爲它將是最常見的用法 - 即使在插入/更新時會增加額外開銷 – Macros 2010-07-08 09:50:21