我有一张300.000+记录的表。
我想在记录的一小部分(0.5%或更少)中添加一些“标记”;
什么是最好的选择:
使用INT字段并将其视为二进制字符串
标记0:xxxxx1将存储为1,
标记0和3:xx1001将存储为9,ecc ..
使用SET数据类型
使用参考表并加入它们;
之类的东西mydata:id | ..
标记:id |标记
mydata_marker:mydata_id | markers_id
添加其他字段(我不喜欢用零填充表格的想法)
我发现第一个选项“可爱”且易于实现,但稍后可能会出现问题。
我不知道如何评论第二个选项,因为我从未使用过该数据类型。
猜测我会选择第三种选择......
任何建议?
答案 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。