2010-01-23 21 views
0

我試圖實現類似於StackOverflow標記功能的功能。用戶可以創建一個新標籤,或者通過鍵入已經創建的類似標籤列表。如果我希望用戶保存標籤並能夠調用已使用的標籤,我需要使用哪種數據庫設計?

這是這個網站上的一個奇妙的功能,我覺得很遺憾,大多數網站沒有這樣的東西。它既強大,又非常靈活,最重要的是:由社區推動。

所以,我有這兩個表:

Company 
    id 
    email 
    name 
    companySize 
    countryOfOrigin 
    industryid 

Industry 
    id 
    description 

用戶每次寫一個新的標籤,我想創建一個具有唯一的ID,並且還能夠搜索現有的標籤。

此數據庫設計是否允許輕鬆高效地實現此功能?

如果不是,請給予一點指導。 :)

+0

我已經用更多的例子更新了我的答案 - 希望它會更有意義。 :-) – 2010-01-24 01:20:16

回答

1

雖然沒有大量的信息繼續下去,但你列出的應該沒問題。 ('tag'是行業表中的'description'字段等)

正如你所想,所有的真實工作都是在SQL之外完成的,你需要...

  1. (可能)添加尚不存在的新標籤。
  2. 將行業與所提供的標籤聯繫起來。
  3. (可能)修剪先前使用的可能不再使用的標籤。

...每次你編輯一個行業。

也就是說,您建議的設置的關鍵限制是每家公司只能屬於一個行業。 (即:它只能有一個與之關聯的單一行業的標籤。)

因此,你可能要考慮沿線的架構......

Company 
    id 
    ... 
    countryOfOrigin 

Industries 
    id 
    description 

CompanyIndustriesLookup 
    companyID 
    industryID 

...這將讓您將多個行業/標籤與給定的公司相關聯。

更新...

例如,此設置下,讓所有與公司ID 1,你會使用相關的標籤......

SELECT Industries.description FROM (CompanyIndustriesLookup, Industries) 
WHERE companyID=1 AND industryID=Industries.ID 
ORDER BY Industries.description ASC; 

在一個類似的基礎上,得到標記的「測試」一個行業所有的公司,你會使用...

SELECT Company.name FROM (Company, Industries, CompanyIndustriesLookup) 
WHERE Company.id=CompanyIndustriesLookup.companyID 
AND Industries.id=CompanyIndustriesLookup.industryID 
AND Industries.description="testing" 
ORDER BY Company.name ASC 
+0

我從來沒有完全理解,你提到的第三張表是正確的「虛擬」表?僅用於關聯多對多關係表之間的信息。對?這是否意味着我不需要在數據庫中物理創建名爲CompanyIndustries的表? – 2010-01-23 23:53:44

+0

你想讓一家公司只有一個與之相關的行業嗎? – 2010-01-24 00:11:01

+0

不,從邏輯上說,一家公司可能在多個行業中。 – 2010-01-24 00:35:41

0

一個非常簡單的(如果有些不理想,但它往往並不重要)使用標籤的解決方案根本就沒有標籤ID。因此,您有:

Items 
    ItemId 
    Name 
    Description 
    ... 

ItemTag 
    ItemId 
    Tag 

向項目添加標籤只是將元組添加到ItemTag表中,無論該標籤是否已存在或不存在。而且您也不必爲刪除標籤做任何記錄。只需在ItemTag.Tag上保留一個索引,即可快速顯示所有唯一標籤。

相關問題