将列添加到大表:datatype或INT或引用表?

时间:2012-03-19 21:54:22

标签: mysql database reference binary set

我有一张300.000+记录的表。

我想在记录的一小部分(0.5%或更少)中添加一些“标记”;

什么是最好的选择:

  • 使用INT字段并将其视为二进制字符串

    标记0:xxxxx1将存储为1,

    标记0和3:xx1001将存储为9,ecc ..

  • 使用SET数据类型

  • 使用参考表并加入它们;

    之类的东西

    mydata:id | ..

    标记:id |标记

    mydata_marker:mydata_id | markers_id

  • 添加其他字段(我不喜欢用零填充表格的想法)

我发现第一个选项“可爱”且易于实现,但稍后可能会出现问题。

我不知道如何评论第二个选项,因为我从未使用过该数据类型。

猜测我会选择第三种选择......

任何建议?

2 个答案:

答案 0 :(得分:2)

鉴于你说只有0.5%的记录会有任何标记,你最好将标记分割成自己的子表。一旦你有了这个子表,那么你就不会浪费太多空间,并且可以使用int,文字mysql bit field,单个每个标志字段等...

e.g。假设只有8个标志,则需要一个tinyint字段,即1个字节。这将浪费大约290千字节的存储空间。将它分离到自己的子表中,新表有一点点开销,然后是各个标志记录的~10k存储空间。

答案 1 :(得分:2)

我完全可以避免使用第一个选项,因为它需要外部处理或丑陋的查询才能弄清楚发生了什么,它会改变这些标记后来的工作方式。

我会使用第三个选项:制作一个标记表,其中包含您附加的信息(至少是id和名称)以及has_marker或类似内容的表格。 has_marker只需要您现有记录的主键和要添加的标记的主键。包含外键,唯一(record_id,marker_id)(如果适合您的数据模型),并考虑将这两列作为速度提升索引,具体取决于您的代码对它们执行的操作。

这可能有点笨重,但它为您提供了实施和未来变化的最大自由。它还可以将您的所有数据保存在数据库中(而不需要数据库和您对“9”或“1001010101”或任何其他类似系统所指标记的解释),并且可以轻松地从两个方向查询(标记是什么)这个记录是否具有OR /具有此/标记的记录)与简单连接。最后,使用此方法添加一个全新的标记是微不足道的 - 在标记表中创建一个新行,并为应该拥有它的每个记录添加has_marker。