2012-10-22 65 views
0

我有兩個表...Mysql的避免桌到桌的關係

表 「標籤」

+---------+----------+ 
| tag | id  | 
+---------+----------+ 
| nancy | 902 | 
+---------+----------+ 
| fred | 903 | 
+---------+----------+ 
| suzan | 904 | 
+---------+----------+ 
| joe | 905 | 
+---------+----------+ 

和table標籤來標記

+---------+----------+ 
| tag_a | tag_b | 
+---------+----------+ 
| 903 | 902 | 
+---------+----------+ 
| 905 | 903 | 
+---------+----------+ 
| 902 | 904 | 
+---------+----------+ 
| 904 | 905 | 
+---------+----------+ 

我經常掃描標籤使用帶有「標籤」表的INNER JOIN語句來標記關係,以便我可以查詢誰與「南希」有關。我想知道如果將標籤的名稱轉儲到標籤表的標籤中,而不是加入標籤表,我可以更好地利用標籤名稱來查找關係。加入這個表格是一個巨大的表現嗎?我的標籤表格在900k行範圍內。標籤表大約30k。

回答

1

如果您希望存儲任何有關該標記的元信息,那麼無論如何您需要一張tag表。增加一個連接確實可能會增加查詢的費用

在你的情況,我建議你考慮以下幾點:

  1. 使用InnoDB
  2. 變化idTagString
  3. 將實際的標籤在TagString
  4. 創建一個外鍵Tag表,級聯更新/刪除

通過這種方式,您可以在單個列上進行分組,過濾等等,但是如果您需要更多信息,則可以加入Tag表(或任何您需要的表)。

我遇到了一些嚴重的MySQL性能問題,當我們遇到了8000萬條標記記錄,並在http://tagcloud.com上進行實時連接以生成標籤雲時......一些緩存確實幫助了這一點,但它仍然像是推動設計關係數據庫的限制(正常形式)。如果使用不同的存儲格式,寫入時可能會更昂貴,但讀取速度更快,我們本來會更好。

+0

愛得到Tagcloud.com的開發者的迴應:)謝謝你,我會研究這一點。我必須閱讀使用外鍵和InnoDB,但是,我感覺這肯定是正確的方向。 –

+0

@HowardZoopaloopa:你還記得tagcloud.com嗎?這很有趣 - 很久以前。我很樂意完成重新發布並再次發佈。 – gahooa

+0

PS。感謝您將我的代表碰到20,000! – gahooa