Mysql 具有二进制信息的多行多列数据库表的设计

Mysql 具有二进制信息的多行多列数据库表的设计,mysql,sql,many-to-many,Mysql,Sql,Many To Many,我们想在sql数据库中创建一个包含10^6行的表。每个条目都有许多二进制属性(比如大约30个,每行只有少数属性集True,大多数属性集False)和一些整数属性(比如大约5个) 我怎么摆好这样一张桌子 具体来说,我应该在表中为每个属性(二进制或整数)设置一列,还是应该为整数属性设置列,并使用二进制属性以及多对多关系创建新表?或者还有其他更好/更干净的选择吗 我应该补充一点 我们通常会查询具有给定属性组合的行,因此我们希望这些选择易于编写、干净且快速 我们将定期添加二进制属性 典型的条目如下所

我们想在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 

我建议使用名为'some_status'的整型列来替换具有相同类别的某些属性,而不是使用太多只包含true/false值的列。例如,一些状态=10表示活动,一些状态=20表示非活动,一些状态=30表示挂起等。它可能有助于减少一些列

建议2

正如您所提到的,您将定期添加二进制属性,所以我建议您像下面这样设计数据库,以便您可以随时更新二进制属性表

和对于只有少数二进制属性为true的情况,可以考虑只在EntruyUnByAyLyType属性表中添加那些二进制属性。稍后选择时,如果二进制属性不在Entry\u Binary\u properties表中,则默认为false

希望这会有所帮助


测试时,您将了解性能。测试两个要点的数据和虚拟数据最多需要两个小时。老实说,与第二个项目相比,生成第一个项目符号虚拟数据所需的时间要少得多。你将如何做到这一点,将通过一个大约5000行的不同集合,然后重复它们类似于上面的链接。这样,它可以让你的索引更真实,更接近真实的生活体验

立即浮现在脑海中的要点利弊如下:

您的第一个要点将从一个(或多个)项目中受益匪浅。这意味着相比之下,你的阅读查询速度会更快。您可以从索引页“覆盖”信息中获益,而无需从索引页遍历到数据页。请注意,您的覆盖索引在您所称的所有二进制和整数列中都是可行的,因为它们很薄

根据您的查询,并且只有您知道,您还需要调查a.k.a.多列索引。原因在于,检索速度

Coverage和Composite之间的区别在于,尽管它们都在多个列上,但Coverage索引不需要访问数据页来检索读取信息

相反,任何对模式的
常规
更改都需要使用
altertable
语句和索引重新生成。在相对较小的10^6行表格上。在一个10^9不同的故事中

子弹一的评论就这样结束了

当需要更改时,您的第二个要点(关联/连接/相交表)将受益于更理智的开发人员方法。但与你的第一个子弹中使用的覆盖或综合指数策略相比,它的表现会受到影响。我估计检索的顺序会慢很多。只是猜测,值得打赌,不难测试


在这两种情况下,只有你自己知道什么时候你的索引选择是正确的,而不是免费的。检索速度的提高带来了插入/更新速度的缓慢。

我也遇到过类似的问题,并使用了交叉引用(xref)表。它是一个包含两个主键列的表,这两个主键列都是相关表的外键

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

感谢您的回答——我必须承认,我不能完全相信这是设置db结构的正确方法。我还添加了一个关于根据属性进行查询的句子。你的建议让这很难做到。我知道它可能不适用于你的情况,也许你可以更新一些代码样本或二进制/整数属性,以便我们更容易为你回答。=)在上面添加了一个建议2,希望它能帮助您了解数据库设计中的一些图像谢谢你的回答,德鲁,我必须玩并消化它,我会这么做的!