2012-07-26 56 views
1

我想爲我的項目使用MySQL設計一個標籤式結構。將標籤保存爲MySQL中的一個位域。有索引?

看完這個http://forge.mysql.com/wiki/TagSchema之後,我感到非常失望,因爲m2m表格設計需要這麼多join性能肯定會吸引大量數據。

我心目中是一個標籤表,每個標籤具有nameid

然後在項目表我要標記,每個項目都有一個名爲tag列,每個標籤標誌着其位指數1,否則位字段的值爲0

例如

table: tag 

id name 
1 tag1 
2 tag2 
3 tag3 



table: item 

id  name tag (in binary)  tag (in array) 
1  item1 00000001   [tag1] 
2  item2 00000100   [tag3] 
3  item3 00000110   [tag2, tag3] 

所以如果我想查找某些標籤的item,我只需要&的比納爾y標籤字段與想要的標籤id

  1. 我的設計是好主意還是壞主意?

  2. 我可以在標籤bitset字段上使用索引,以便加快查找速度嗎?

  3. 如果MySQL不能做#2,什麼是我的最佳選擇(除了的NoSQL)

提前感謝!

回答

1

不,對於多對多關係所需的兩個連接不會吸引大量數據,這是一個基本的設計模式,MySQL加入時異常快速。如果有超過32個不同的標籤(或64個,如果使用BigInt數據類型),則您的設計會中斷 - 您能發現原因嗎?此外,通常最好先擔心實施您的應用程序,並在後來成爲問題時關心性能。

+0

我不打算使用int或bitint,我打算使用二進制字段。您的設計不好,因爲對於每件商品平均3個標籤,如果商品表有1m行,則必須掃描3m行以獲取標籤ID,然後在標籤表中掃描實際標籤名稱。 – est 2012-07-27 01:39:04

+0

不,我不需要掃描數百萬行,因爲每個外鍵都有一個自動分配給它的索引(而它沒有,我肯定會分配一個索引)。因此,如果任務是查找某個您知道id的項目的所有標籤,則MySQL需要按照「log(3m)」操作的順序查找該項目的所有標籤id和另一個「log」(不同標籤的數量)'來查找標籤名稱。如果你想使用'BINARY',MySQL將需要一個索引長度,所以你的模式仍然決定了不同標籤的最大數目。 – Simon 2012-07-27 08:57:47