我一直认为数据库应该针对读取性能进行非规范化,因为它是为OLAP数据库设计完成的,而不是为OLTP设计进一步夸大3NF.
PerformanceDBA在各种帖子中,例如,在基于时间的数据的不同方法的表现中,捍卫了数据库应该总是通过归一化到5NF和6NF(正规形式)来精心设计的范例.
我是否理解正确(以及我理解的是什么)?
OLAP数据库(低于3NF)的传统非规范化方法/范例设计有什么问题,以及3NF足以满足大多数OLTP数据库实际情况的建议?
例如:
我应该承认,我永远无法理解非规范化有助于读取性能的理论.任何人都可以给我参考,对这个和相反的信念有很好的逻辑解释吗?
在试图说服我的利益相关者说OLAP/Data Warehousing数据库应该规范化时,我可以参考哪些来源?
为了提高可见度,我从评论中复制了这里
"如果参与者在他们看到或参与过的6NF中添加(披露)有多少现实生活(没有包含科学项目)的数据仓库实施,那将是一件好事.快速集合.Me = 0." - Damir Sudarevic
维基百科的数据仓库文章告诉我们:
"标准化的方法[与Ralph Kimball的维度相比],也称为3NF模型(第三范式),其支持者被称为"Inmonites",相信Bill Inmon的方法,其中声明数据仓库应该是使用ER模型/标准化模型建模."
看起来规范化的数据仓库方法(Bill Inmon)被认为不超过3NF(?)
我只是想了解数据仓库/ OLAP是非规范化的同义词的神话(或无处不在的公理信念)的起源是什么?
达米尔苏达雷维奇回答说他们铺好了道路.让我回到这个问题:为什么反规范化被认为有助于阅读?
我想设计一个数据库,描述如下:每个产品在一个时间点只有一个状态.但是,产品的状态可能会在其生命周期内发生变化.我如何设计产品和状态之间的关系,可以很容易地查询当前特定状态的所有产品?另外,有谁可以请给我一些关于设计数据库的深入细节,这些数据库与上述问题的持续时间有关?谢谢你的帮助
我们有一个带有20多个列的表的应用程序,这些列都是可搜索的.为所有这些列构建索引会使写入查询变得非常缓慢; 任何真正有用的索引通常必须跨越多列,增加所需的索引数量.
但是,对于这些搜索中的95%,只需搜索这些行中的一小部分,而且数量相当少 - 比如50,000行.
因此,我们考虑使用mySQL分区表 - 有一个列基本上isActive就是我们将两个分区划分的列.大多数搜索查询都将运行isActive=1.然后,大多数查询将针对小型50,000行分区运行,并且在没有其他索引的情况下快速运行.
唯一的问题是isActive=1没有固定的行; 即它不是基于行的日期或任何固定的那样; 我们需要isActive根据该行中数据的使用情况进行更新.据我所知,这不是问题; 在UPDATE查询期间,数据只会从一个分区移动到另一个分区.
我们有一个PK对id的,虽然该行; 我不确定这是不是一个问题; 手册似乎暗示分区必须基于任何主键.这对我们来说将是一个巨大的问题,因为主键ID没有依据是否行isActive.
我正在创建一个应用程序,其核心功能随时间跟踪各种数据(血糖水平,胰岛素剂量,食物摄入量等),我正在尝试决定如何最好地在数据库中组织这些信息.
最基本的是这个特定伞中的所有内容都是一个事件,因此我想到了一个包含可能出现的所有属性的字段的事件表.然而,这可能是笨拙的,因为绝大多数领域最终将成为许多领域的空白; 但我不确定这是否真的是一个问题.这种方式的好处是可以更容易地调用和显示所有事件.但由于许多事件只有"时间戳"的共同点,我怀疑它们是否属于同一个表.
我不确定为每种事件都有一个表是有意义的,因为单独使用大多数事件只有一个属性而不是时间戳,并且它们通常必须混合在一起.(许多类型的数据通常但不总是出现在一个组中)
某些类型的事件有持续时间.有些是比较罕见的.一类事件通常是保持不变的比率,除非费率被改变为良好或临时覆盖(这些是我最担心的).有些是简单的二进制标记(我计划使用链接表,但为了简单起见,我需要/更喜欢整个event_id来链接它们.
我的倾向是,最好有一些表与密切相关的信息类型,而不是一张表,包含所有内容和大量空间......但我不太清楚如何继续.
在这样的情况下,我会喜欢一些关于确定最佳方法的策略建议.
编辑:这是我正在处理的数据类型的简要说明,以防它更清楚
events:
-blood glucose
timestamp
value
(tagged w/: from pump, manually entered
[pre-meal, post-meal (breakfast, lunch, dinner) before bed, fasting, hypo, high, hyper - which will be either manually entered or inferred based on settings or other user entries], before/after exercise etc i imagine would be better off dynamically generated with queries as necessary. though could apply same paradigm to the meals?
-sensor glucose (must be separate bc it is not as reliable …Run Code Online (Sandbox Code Playgroud) 考虑具有以下特征的系统:
我可以想到三种建模方法。
1.宽表-具有每个类别的表(已覆盖)
注意:由于数据点是单独收集的,因此具有很多稀疏值。存储新指标需要新列

2.窄表-带有每个指标的表(已覆盖)
注意:新指标的存储需要一个新表

3.类型表(未涵盖)-具有单个指标表(未涵盖)
注意:新指标的存储仅需要metricType表中的新行,而无需更改架构。尽管由于按时间段在所有指标上进行分组而不需要联接,因此可以担心由于块大小而对性能造成的影响,因此可以更快吗?

我想知道是否有人可以评论或提出选项,让我指出一些性能基准,包括3以及1和2,或者通常就每种方法的适用性提供任何建议。我计划对此进行自己的实验,完成后将发布结果,但在此阶段,您将不胜感激。:)
请注意,不建议使用nosql解决方案,我知道该领域的选项,并正在分别评估该选项