2012-10-28 22 views
0

我正在嘗試構建一個將特定標籤分配給某個項目或將某個人分配給某個人的小系統。所以,我有一個人名單和一個標籤列表。我需要爲每個人分配3個特定的標籤(對應於這個人可能擁有的3種不同技能)。將特定標籤分配給某個項目的數據庫設計

簡而言之,輸出應該是這樣的:

Person 1 | webdesign, ux, jquery 
Person 2 | blogging, photography, wordpress 
Person 3 | graphic-design, 3d, inventor 
... 

現在,這些列表存儲在兩個不同的表:

我的主要目標是,以避免重複和只需將3個現有標籤分配給現有人員即可。

你能給我提供一些關於如何實現這個的提示嗎?我知道一個three-table設計對於標籤系統是很常見的,但這與我的情況有關嗎?

感謝您的幫助。

回答

3

如果你想確保你沒有任何重複,並能夠N標籤添加到一個人,然後正確地實現標準化設計,你將需要第三個錶鏈接的tags每個person

persons_2_tags 
-------------- 
person_id 
tag_id 

爲了保證唯一性,您可以使用複合主鍵,也可以將unique index添加到包含兩列的表中。

在此SQL Fiddle中查看以上示例。

如果需要強制在數據庫級別的3標記物的限制,可以在第三列添加到persons_2_tags表(tag_number爲例)是與1, 2, 3值的enum並添加到您的unique index。插入邏輯需要在應用程序級別進行處理,但會由index執行。

+0

沒錯。爲了獲得唯一性,您需要在person_id和tag_id列的組合上添加一個唯一約束。 – Marvo

+1

糟糕,失去了我的思路......我實際上會使用組合主鍵。 – doublesharp

+0

太棒了,這正是我想到的。你能否向我展示一個典型的要求,讓我可以利用這三張表來完成我所描述的事情? – morgi

1

您的要求是否指定「確切」3個標籤?

建議第三張表保持標準化。這是一種典型的多對多關係。由於您可以擁有無​​限但唯一的用戶/標籤對列表,因此會帶來最大的靈活性。

對於每個標籤,用戶表中可以有3列。性能會以犧牲靈活性爲代價而得到改善。像「使用tag ='X'列出所有用戶」的查詢有點困難。如果您允許少於3個標籤,則可能有多個空值。當然,在這種設置中,您必須創建一個新列和大量代碼才能擴展到三列以上。

+0

確實有一個限制,每個人必須分配3個標籤。 – morgi

0

我想我可能會做這傑夫Ø然而,如上所述,只是提出另一種觀點三個表設計...

如果你只是在談論的標籤,即沒有其他元數據的短字符串,我不知道你會需要一個tags表。本質上,標籤本身可以是它的ID。

persons (person_id, person_name); 
tags (person_id, tag); 

呀,你會得到一個位重複出現,但他們還是很短字符串,它應該真正有所作爲。沒問題。