2012-03-19 56 views
1

我有一个300.000+记录的表格。我想添加一些“标记”的一小部分的记录(0.5%或更少);将列添加到大型表:数据类型或INT或参考表?

这将是最好的选择:

  • 使用INT领域,并把它当作一个二进制字符串

    标志0:xxxxx1将存储为1,

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

  • 使用一组数据类型

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

    mydata:id | ...

    markers:id | marker

    mydata_marker:mydata_id | markers_id

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

我觉得实施首选项“可爱”而简单,但也许有问题的变化晚些时候。

我不知道如何评论第二个选项,因为我从来没有使用过这种数据类型。

在猜测我会去的第三个选项...

什么建议吗?

回答

2

鉴于你说只有0.5%的记录会有任何标记,你最好将标记拆分到他们自己的子表中。一旦你有了这个子表,那么你不会浪费接近那么多的空间,并且可以使用一个int,一个文字mysql bit field,单个的每个标志字段等等。假设只有8个标志,你需要一个tinyint字段,它是1个字节。那会浪费290kbytes的存储空间。把它分成它自己的子表格,新表格有一点点的开销,然后〜个10k的存储单个标志记录。

2

我会直接避开第一个选项,因为它需要外部处理或丑陋的查询来弄清楚发生了什么,它会改变这些标记后来如何工作的痛苦。

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

这可能有点笨重,但它给你实施和未来变化的最大自由。它还将所有数据保存在数据库中(而不需要同时需要数据库和“9”或“1001010101”或任何其他类似系统的标记),并且可以方便地从两个方向查询(哪些标记这个记录是否有OR记录有这个/这些标记)与简单的连接。最后,用这种方法添加一个全新的标记是微不足道的 - 在标记表中添加一个新行,并为每个应该添加的记录添加has_marker。

相关问题