多个表与一个具有更多列的表

Posted

技术标签:

【中文标题】多个表与一个具有更多列的表【英文标题】:Multiple tables vs one table with more columns 【发布时间】:2022-01-07 15:52:55 【问题描述】:

我选择的数据库是 MongoDB。但问题应该是独立的。

例如,每行记录都有一个标志,可以取 2 个可能值中的 1 个。

什么是优缺点:

有 1 个表,其中有一列用于保存此标志的值。

对比:

优点和缺点:

有 2 个表来保存由上述标志区分的两种不同类型的记录? 由于您没有额外的列,这在存储方面会更便宜吗? 这在查询中是否也会更快,因为您无需执行过滤即可确切知道要查看哪个表?

行业的常见做法是什么?

【问题讨论】:

你有例子吗?你错了,无论你拥有像 MongoDB 这样的 NoSQL 数据库还是关系型 RDBMS,都会产生很大的不同。 您能解释一下为什么 NoSQL 与关系 RDBMS 会有所不同吗?我的示例与票证中描述的一样基本。 NoSQL 数据库没有针对连接进行优化(其中一些甚至根本不支持连接)。 @WernfriedDomscheit 鉴于这两个表实际上是同一个实体,您不会期望任何连接吗?最多,我们必须执行一个联合来将它们合并为 1? 【参考方案1】:

仅包含一个标志的单列(例如activearchived)的存储应该可以忽略不计。使用两个表查询可能会更快,但是您的应用程序更复杂,您必须编写 2 个查询。

当您只有 2 个不同的值并且这些值或多或少均匀分布时,将不会使用索引,因此性能应该相同 - 除非您选择整个表。

如果标志分布不均匀,则拥有 2 个表可能会很有用。例如,您有一个相当小的 active 数据集,它经常被查询,还有一个大的 archive 数据集,它更大但几乎没有被查询。

如果可用,您还可以使用实际上是两者的良好组合的分区。

【讨论】:

为什么如果 2 个标志值是均匀分布的,那么“并且不会使用索引”?为什么不使用索引时性能会相同?为什么选择整个表会导致不同的性能结果? 只有在选择性的情况下才会使用索引。当索引列只有 2 个值并且每个值都出现在 app.所有行的 50% 则索引无用且未使用(除非您在 Oracle 上有特殊的 Bitmap-Index)。 从 100 万行的表中选择所有行,比从只有 50 万行的表中选择所有行花费的时间更长。

以上是关于多个表与一个具有更多列的表的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Nhibernate 从连接两个具有所有 id 的表中选择只有一个不同列的多个列是 UNIQUEIDENTIFIER

Hive:无法在具有 100 个或更多分区列的表中插入数据错误:在最大长度为 767 的列“PART_NAME”中

从 MySQL 中具有不同列的表的多个连接结果中删除重复项

表与许多表具有一对一的关系

一个具有许多分区键的 Azure 表存储表与许多具有较少分区键的表相比如何?

使用 JavaScript,如何在具有多个值的日期列的表中突出显示“今天”的每个日期