将标记保存为MySQL中的位字段。有指数?

时间:2012-07-26 08:30:03

标签: mysql tags bit-manipulation bit-fields bitset

我正在尝试使用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,我只需要&带有所需标记id的二进制代码字段。

  1. 我的设计是好主意还是坏主意?

  2. 我可以在标签位集字段上使用索引,这样我可以加快查找速度吗?

  3. 如果MySQL不能做#2,那么我最好的选择(除了NoSQL)

  4. 提前致谢!

1 个答案:

答案 0 :(得分:1)

不,多对多关系所需的两个连接并不会对大数据产生影响,这是一个基本的设计模式,而MySQL的加入速度非常快。如果有超过32个不同的标签(或64,如果你使用BigInt数据类型),你的设计会中断 - 你能发现原因吗?此外,通常最好先担心实施应用程序,并在以后出现问题时关注性能。