多个表与一个具有更多列的表
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】:仅包含一个标志的单列(例如active
和archived
)的存储应该可以忽略不计。使用两个表查询可能会更快,但是您的应用程序更复杂,您必须编写 2 个查询。
当您只有 2 个不同的值并且这些值或多或少均匀分布时,将不会使用索引,因此性能应该相同 - 除非您选择整个表。
如果标志分布不均匀,则拥有 2 个表可能会很有用。例如,您有一个相当小的 active
数据集,它经常被查询,还有一个大的 archive
数据集,它更大但几乎没有被查询。
如果可用,您还可以使用实际上是两者的良好组合的分区。
【讨论】:
为什么如果 2 个标志值是均匀分布的,那么“并且不会使用索引”?为什么不使用索引时性能会相同?为什么选择整个表会导致不同的性能结果? 只有在选择性的情况下才会使用索引。当索引列只有 2 个值并且每个值都出现在 app.所有行的 50% 则索引无用且未使用(除非您在 Oracle 上有特殊的 Bitmap-Index)。 从 100 万行的表中选择所有行,比从只有 50 万行的表中选择所有行花费的时间更长。以上是关于多个表与一个具有更多列的表的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Nhibernate 从连接两个具有所有 id 的表中选择只有一个不同列的多个列是 UNIQUEIDENTIFIER
Hive:无法在具有 100 个或更多分区列的表中插入数据错误:在最大长度为 767 的列“PART_NAME”中