2010-01-05 214 views
2

我有以下表格;將標籤插入表格的最有效方法是什麼

CREATE TABLE IF NOT EXISTS `tags` (
    `tag_id` int(11) NOT NULL auto_increment, 
    `tag_text` varchar(255) NOT NULL, 
    PRIMARY KEY (`tag_id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=9 ; 


CREATE TABLE IF NOT EXISTS `users` (
    `user_id` int(11) NOT NULL auto_increment, 
    `user_display_name` varchar(128) default NULL, 
    PRIMARY KEY (`user_id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=10 ; 

CREATE TABLE IF NOT EXISTS `user_post_tag` (
    `upt_id` int(11) NOT NULL auto_increment, 
    `upt_user_id` int(11) NOT NULL, 
    `upt_post_id` int(11) NOT NULL, 
    `upt_tag_id` int(11) NOT NULL, 
    PRIMARY KEY (`upt_id`), 
    KEY `upt_user_id` (`upt_user_id`), 
    KEY `upt_post_id` (`upt_post_id`), 
    KEY `upt_tag_id` (`upt_tag_id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=9 ; 

CREATE TABLE IF NOT EXISTS `view_post` (
`post_id` int(11) 
,`post_url` varchar(255) 
,`post_text` text 
,`post_title` varchar(255) 
,`post_date` datetime 
,`user_id` int(11) 
,`user_display_name` varchar(128) 
); 

這個想法是,我想使用最有效的方式來保存標籤,爲一個職位和用戶。簡單地說,一旦我添加一篇文章,我會在帖子和用戶身上傳遞一些標籤。稍後我希望能夠爲每個用戶和帖子計數標籤。與Stack Overflow非常相似。

我想'tag_text'應該是唯一的嗎?如果我每次提交一個新帖子來檢查'標籤'表以檢查標籤是否已經存在,並且如果是,則返回'tag_id',以便我可以將其插入'user_post_tag'表中。

這可能是一種解決這類問題的不好方法。

歡迎您提出任何建議。

+0

完成後,你會以開放源碼的形式發佈嗎?與「與堆棧溢出非常相似」 – ant 2010-01-05 22:37:58

回答

2

是的,你正在做的是做到這一點的最好方法。您創建了一個n到m的關係,因爲帖子可以有多個標籤,同一個標籤可以在多個帖子上。您不想爲每個帖子存儲標籤名稱,因此您需要存儲該ID。

但是,您應該 - 不應該 - 對於同一個用戶,這個存儲多次存儲的次數是相同的tag_id。如果用戶有多個標籤,並且您必須爲每個標籤執行SELECT count(...),它將會嚴重影響您的服務器。你明白我在說什麼嗎?因爲現在,如何獲得用戶A有多少次標籤B?你必須做SELECT count(*) FROM user_post_tag INNER JOIN tags ON (...) WHERE user_id=A and tag_id=B

我的建議是user_post_tag分成兩個表:

  1. user_tags,算用戶有多少次這樣的標籤,主鍵是user_idtag_id,你就會有一個count領域,每當此用戶使用標籤發佈新帖子時,您只需更新count=count+1。這樣,您只需執行SELECT tag_text, count FROM user_tags INNER JOIN tags ON (...) WHERE user_id=A即可選擇給定用戶的所有標籤(使用次數)。您正在使用完全索引的查詢。你不要求MySQL翻過桌子,尋找一堆行並對它們進行計數,你要告訴MySQL,在這張桌子和另一張桌子上放這一行,加入它們並快速給我!
  2. post_tags,要存儲某個帖子的標籤,主鍵爲post_idtag_id,不需要額外的字段。

我想的是, 'tag_text' 應該 是唯一的?如果我有效運行 函數,每次我提交一個新的 帖子去'標籤'表 檢查標籤是否已經存在,如果 是,返回它的'tag_id',這樣我就可以 插入它到'user_post_tag'表中。

是的,它應該是唯一的。在插入和插入前檢查一個標籤是否存在,如果它沒有冗餘,並且必須執行SELECT ... count(*)以知道標籤已被使用多少次,那麼檢查它是否更好。與帖子選擇相比,創建帖子的頻率會更低,因此如果您必須在插入和選擇的查詢密集之間進行選擇,那麼肯定會選擇插入。順便說一句,如果你想計算有多少帖子具有相同的標籤,就像堆棧溢出一樣,你需要另外一個表,主鍵爲tag_id,然後,就像user_tags一樣,每當帖子獲得特定標籤時,您就會增加count字段。

0

嗯,如果你的標籤都是唯一的,那麼你不需要標籤表中的tag_id和tag_text。只需使用tag_text並將其作爲主鍵即可。然後查看REPLACE INTO(http://dev.mysql.com/doc/refman/5.0/en/replace.html)以處理新標籤。

將標籤與用戶或帖子關聯? user_tags表和post_tags表。沒有自動遞增值,只有帶有user_id和tag_text或post_id和tag_text的複合鍵。我不知道您是否正在查看user_post_tags表,以便通過加入包含帖子和用戶的post_tags表來提高性能。儘管如此,「替換成」也應該成爲你的朋友。

+0

我建議堅持數字鍵。如果您將文本字段設置爲唯一鍵,那麼'REPLACE INTO'技巧仍然可以工作,並且會使整個標籤的重命名變得更加容易。 – nickf 2010-01-05 23:32:34

相關問題