2009-07-11 138 views
1

我正在尋找數據庫方案的幫助,而不是實際的「雲」本身。PHP標籤雲

在用戶提交圖像並可以標記圖像的網站中,應如何設置數據庫以實現最佳性能?

我想

ID - int(11), unique, auto_incremenet 
tag - varchar(20) 
imageID - int(11) 

所以假設我上傳圖片,並標記爲「多倫多,壽司,夏天」。

查詢是:

INSERT INTO tags (tag, imageID) VALUES ('$tag[0]', $imageID); 
INSERT INTO tags (tag, imageID) VALUES ('$tag[1]', $imageID); 
INSERT INTO tags (tag, imageID) VALUES ('$tag[2]', $imageID); 

然後檢索,我會選擇從標籤,其中圖像標識= $ imagID *。

這是否有缺陷?

回答

3

您應該在兩個表格之間有一個HABTM關係(一個用於標籤,第三個表格包含圖像ID和標籤ID)。這樣您就不會限制圖像可以具有的標籤數量或標籤可以屬於的圖像數量,也不會有重複。

+0

我最終這樣做。主要是因爲我覺得這是SoF的做法,可以讓我爲該表添加額外的列,比如哪個用戶首先創建了該標籤等。 – sqram 2009-07-12 00:50:44

3

除了共享相同標記的圖像在數據庫中有重複條目之外,我沒有看到這種方法的任何實際問題。如果你嘗試規範化,你最終會得到一個包含重複引用的表,該表包含了另一個擁有標籤本身的表,在這種情況下,這似乎是浪費時間(編碼,連接和遍歷MySQL表)。

我認爲一個很小的優化就是列的順序。把'int'分組在一起,因爲它們是MySQL的固定寬度,這意味着它們可以以比int varchar int更高的順序進行搜索。

1

我會用一個單獨的標籤表: 表標籤: tag_id- INT(11),獨特的,auto_incremenet 標籤 - VARCHAR(20)

TABLE image tags: 
ID - int(11), unique, auto_incremenet 
tag - varchar(20) 
imageID - int(11) 

然後,我會擡頭,如果標籤INSERT INTO標記(標記,圖像ID)VALUES('$ tag_id [0]',$ imageID);已經存在並且將只插入標記。 INSERT INTO tags(tag,imageID)VALUES('$ tag_id [1]',$ imageID); INSERT INTO tags(tag,imageID)VALUES('$ tag_id [2]',$ imageID);

通過這種方式,具有相同標籤的圖像將更容易找到,因爲它們共享相同的tag_id而不僅僅是相同的varchar內容。 當然,您應該將標籤轉換爲小寫字母並替換特殊字符等。

1

確保imageID字段上有一個索引。

2

將標記字段更改爲char(20)還會提高性能嗎?整個表格將變成固定寬度,並且在固定寬度表格上運行的查詢通常更快 - 所以我引導我相信我最近對數據庫設計的研究。

被固定爲20個字符會導致表中佔用的空間量有點小開銷,但無論如何它是一個如此小的表,我看不到稍大的文件大小是個大問題。如上所述,事實上是一張小桌子,我想在你看到varchar(20)和char(20)之間的區別之前,你需要很多行數據。

只是一個想法。 :)