设计具有多行和多列二进制信息的DB表

时间:2016-06-03 06:55:05

标签: mysql sql many-to-many

我们想在sql数据库中创建一个包含~10 ^ 6行的表。每个条目都有许多二进制属性(比如大约30个,每行只有几个属性集True,大多数集False)和一些整数属性(比如大约5个)。

如何设置这样的表?

具体来说,我应该在表中为每个属性(二进制或整数)设置一列,还是应该为具有二元属性和多对多关系的整数属性和新表创建列?或者还有其他更好/更清洁的选择吗?

我应该添加

  • 我们经常会查询具有给定属性组合的行,因此我们希望这些选择易于编写,清理和快速,

  • 我们会定期添加二进制属性

典型的条目看起来像是具有整数属性I和二进制属性B

EntryID | I1 | I2 | B3 | B4 | B5 | B6 | B7 | B8 | B9 | ... | Bn
---------------------------------------------------------------
1234567 | 12 | 5  | 2  | F  | F  | F  | F  | T  | F  | ... | F 

3 个答案:

答案 0 :(得分:1)

我建议使用名为like' some_status'的整数类型列,而不是只有太多列只有true / false值。替换一些具有相同类别的属性。例如some_status = 10代表active,some_status = 20代表active,some_status = 30代表pending等。它可能有助于减少一些列。

建议2

正如您所提到的,您将定期添加二进制属性,因此我建议您设置如下所示的数据库,以便随时更新Binary_property表。

对于只有少数二进制属性为真的情况,您可以考虑仅在Entry_Binary_properties表中添加这些二进制属性。稍后当您选择时,如果Binary属性不在Entry_Binary_properties表中,则默认情况下它将为false。

希望这会有所帮助。 =)

enter image description here

答案 1 :(得分:1)

测试时,您将了解性能。对于与虚拟数据放在一起的两个项目符号,最多需要两个小时到jam in个测试数据。说实话,你的第一个子弹点虚拟数据生成所需的时间比你的第二个子弹少得多。你将如何做到这一点将通过一组约5000行,然后重复它们类似于上面的链接。这样,它可以使您的索引保持诚实,并且接近现实生活体验。

子弹点的优点和缺点立即浮现在脑海中:

你的第一个要点将从Covering Index(或几个)中受益匪浅。这意味着您的Read查询将通过比较快速尖叫。您可以从索引页面“覆盖”信息中受益,而无需从索引遍历到数据页。请注意,当您调用它们时,覆盖索引在所有二进制和整数列中都是可行的,因为它们很薄。

根据您的查询,只有您知道,您还需要调查Composite Indexes a.k.a.多列索引。原因是,检索速度快。

Covering和Composite之间的区别在于,虽然两者都在多列上,但Covering索引不需要访问数据页来检索读取信息。

另外,对regular语句的任何alter table更改都需要在var sticky = document.querySelector('.sticky'); var origOffsetY = sticky.offsetTop; function onScroll(e) { window.scrollY >= origOffsetY ? sticky.classList.add('fixed') : sticky.classList.remove('fixed'); } document.addEventListener('scroll', onScroll); 语句和索引重新生成时进行。在一个相对较小的10 ^ 6行表。在一个10 ^ 9不同的故事。

因此结束对第一弹的评论。

当需要进行更改时,您的第二个项目符号点(关联/联结/交叉表)将从更加理智的开发人员的方法中受益。但与第一颗子弹中使用的覆盖或复合索引策略相比,它的性能会受到影响。我估计检索的顺序会慢一些。只是一个猜测,值得下注,不难测试。

在任何一种情况下,只有你知道什么时候你有一个从来没有免费赠品的索引选择的正确平衡。随着检索速度的提高,插入/更新的速度变慢。

答案 2 :(得分:0)

我遇到了类似的问题,并使用了交叉引用(外部参照)表。它是一个包含2个主键列的表,这些列都是相关表的外键。

CREATE TABLE Table1Table2Xref (
  Table1id INT foreign key references table1(Id),
  Table2id INT foreign key references table2(Id),
  info char(200),
  primary key (userid, userdataid),
);