2010-07-20 52 views
3

我想構建圖片數據庫。每幅圖片可能有一個或多個標籤,例如:Paris,April 2010,David管理SQL中的圖片標籤

你會如何儲存這些信息? 我認爲具有Files表,每個文件1行,並且將被標籤ID的由逗號分隔的列之一,例如:2,4,14,15

在其它表中調用Tags我認爲有每行1行,如下所示:

Tag ID Tag Name 
------ -------- 
    1  April 
    2  David 
    3  Paris 

您認爲這樣管理標籤是個好主意嗎?例如,如何輕鬆獲取特定圖片的所有標籤名稱?

回答

11

你應該有3張桌子。文件,標籤和FileTag。

FileTags應該有文件ID和標籤ID。一行標籤分配。

然後,您可以方便地查詢所有文件帶有特定標籤:

select distinct f.* from Files f 
join FileTags ft on f.FileID = ft.FileID 
join Tags t on ft.TagID = t.TagID 
where t.TagName = 'Paris' 

或者所有標籤的任何文件:

select distinct t.* from Files f 
join FileTags ft on f.FileID = ft.FileID 
join Tags t on ft.TagID = t.TagID 
where f.FileID = 7 
+2

是的,這是一個典型的Many-To-Manu關係。閱讀:http://www.tekstenuitleg.net/en/articles/software/database-design-tutorial/many-to-many.html和http://www.tomjewett.com/dbdesign/dbdesign.php?page = manymany.php – 2010-07-20 13:14:40

+1

非常感謝! – 2010-07-20 14:19:43

+0

@Misha,正如你接受這個檢查group_concat語法 – Unreason 2010-07-20 15:20:17

4

對於大多數關係數據庫設計,您建議的內容(標記ID以逗號分隔)被認爲是否定的,因爲這不是normalized

您應該有一個帶有TagId和FileId列的附加多對多表。

這意味着您可以存儲單個標籤(說Paris),並將其與許多圖片相關聯。對於每張照片,您都可以存儲多個標籤。

2

在我看來,如果逗號分隔列中的值,你將會非常難以進行搜索,例如「給我所有帶有給定標籤的圖片」我確信有很多方法,但是處理這個問題的標準方法是擁有一箇中間的多對多映射表,該映射表存儲與哪個標籤屬於哪個圖片相關的PhotoID和TagID。

1

我可能會有一個表的圖片和一個標籤,而不是使用多對多的表綁定在一起。這樣就很容易查找圖片的所有標籤或標籤的所有圖片。

1

Mysql的讓你可以得到所有的標籤很容易連出的標準化格式

SELECT f.FileID, group_concat(t.tag_name) 
FROM Files f 
    JOIN FileTags ft ON f.FileID = ft.FileID 
    JOIN Tags t on ft.TagID = t.TagID 
GROUP BY f.FileID 

查看詳細信息here

如果您正在追趕最後一刻的表現,並準備好簽署您不會反對的錯誤,您可以考慮使用set types

注意:這兩個選項都會將您鎖定到特定的RDBMS實現(此處爲mysql)的細節中,因爲其他RBMS可能不會使用相同的語法,甚至不具有上述功能(因此在完美的世界中,上述任何建議都不是好的)。

請務必閱讀關於設置數據類型的limitations,例如,要廣泛重新設計應用程序並不是很有趣,因爲您意識到必須擁有更多64個標籤。

1

我有3個表:

  1. 文件與列 「ID」, 「路徑」,...
  2. 標籤與列 「ID」, 「姓名」 ......
  3. FileTag與列 「的fileid」, 「標籤識別」,...

然後,我會創建外鍵:

  • 「的fileid」是由文件表的外鍵
  • 「標籤識別」會外鍵從標籤

當然實施細則均達到您所選擇的RDBMS。