Database design 报告非规范化与规范化数据库

Database design 报告非规范化与规范化数据库,database-design,database-normalization,denormalization,Database Design,Database Normalization,Denormalization,我们正在构建报告应用程序,在该应用程序中,我们将每天转储大量数据。目前,我们有两个数据模型,一个用于操作,另一个用于报告 报表数据模型中的列很少出现在操作表中。如果操作数据模型得到更新,我们如何确保报告数据模型做出类似的更改,以及更新的成本是多少 例如: Report Table - user_name organisation_name event_name etc 10 more col. User Table - id name

我们正在构建报告应用程序,在该应用程序中,我们将每天转储大量数据。目前,我们有两个数据模型,一个用于操作,另一个用于报告

报表数据模型中的列很少出现在操作表中。如果操作数据模型得到更新,我们如何确保报告数据模型做出类似的更改,以及更新的成本是多少

例如:

Report Table - 
     user_name
     organisation_name
     event_name
     etc 10 more col.

User Table -
    id
    name
    ..

Organisation Table -
    id
    name 

考虑报表表由100万个记录组成,组织名称发生变更,需要在报表表中反映变更。更改细节的频率可能是平均值

所以我们有两个选择 规范化数据库-
这将保存对报表表的更新,但查询处理将花费更长的时间。 非规范化数据库- 这将有助于我们指导更快的查询处理,但维护它将涉及复杂性


请告诉我,我们应该走哪条路?我们的数据量非常大,报告数据的粒度也很高

唯一的选择实际上是标准化数据库。为什么?

优点:

  • 更容易维护
  • 由于您将拥有大量数据,规范化数据库将需要更少的磁盘空间为什么?因为如果不是每次都用用户名来表示用户(平均需要10个字符),而是使用他的id,只需要2到3个字符。从长远来看,这是一个巨大的差异
“较慢”的查询实际上并不较慢。唯一的缺点,这只是小菜一碟,那就是你将不得不编写更多的代码。但是你只需编写一次代码,数据库就会永远存在。

非规范化这个词的问题在于它没有明确说明你将要使用什么样的设计原则。一个更好的计划是采用一个特定的设计计划,这个计划不会导致一个完全规范化的数据库,但它有一些东西可以实现

一个相当广泛使用的设计方案是星型模式,或近似变体雪花模式。这两种模式已用于报告数据库以及数据集市和数据仓库

在我处理星型模式的每一种情况下,数据都是从一个或多个其他数据库复制的,并且这些源数据库是标准化的。源数据库用于OLTP(联机事务处理),而星型模式用于OLAP(联机分析处理),包括报告

定期(例如每天一次)将数据从OLTP存储传输到OLAP存储的过程称为ETL(提取、传输和加载)。这本身就是一门艺术,您可以购买一些工具来促进ETL。如果您想构建自己的ETL流程,还可以学习一些技术

拥有两个数据库(一个用于OLTP,另一个用于OLAP)的模式可以让您在两种不同的上下文中获得两种不同设计模式的好处。维护两个不同的数据库的成本几乎是维护一个数据库的两倍,而且您还必须管理传输过程


所有这些并不能为你的问题提供一个明确的答案,但它确实为你提供了一些在网上搜索相关项目时使用的流行语

第一个问题:

让我们考虑报告表由100万个记录组成, 而组织名称也发生了变化,这种变化 需要在报告表中反映

…更新的成本是多少

它应该很低,因为我们不需要更新“报告表”。您只需要更新维度表,原因如下:

考虑不要制作一个直接由报表工具读取的“报表表”。而是考虑使用星型模式(一个“非正规化”选项)。报告将通过在运行时将事实连接到维度来生成

请参考销售之星模式的实体关系图(ERD):

让我们想象一下,Wiki文章中的示例ERD是一个拥有不同商店品牌的公司的数据仓库,因此它们的名称会彼此不同

因此,让我们将“store\u name”列添加到DIM\u store表中,并且仅添加到DIM\u store表中。事实上,销售表保持不变

当商店更改其名称时,我们会更新DIM_store.store_name列

DIM_STORE和FACT_SALES在STORE_id上加入,允许我们从DIM中获取当前商店名称

商店很少更改名称,但一旦更改,报表用户通常希望记录此更改。这种类型的维度更新称为缓慢变化的维度(SCD)

这篇Wiki文章解释了SCD:

供参考,通常使用SCD类型1和2。我更喜欢类型2,因为它保留了历史记录,但请根据您的报告要求选择最佳的类型

ERD来自这篇关于星型模式的Wiki文章:

第二个问题:

如果操作数据模型得到更新,我们将如何 可以确保报告数据模型进行类似的更改

如果源系统中的表结构发生更改,则必须手动更新加载过程和相应的数据仓库表。在某些情况下,这可能涉及重新加载所有数据

代理密钥:与您的问题密切相关,代理密钥是维护SCD所必需的:

在SCD上的Wiki文章中,supplier_密钥是由数据仓库或ETL过程生成的代理密钥,supplier_代码类似于来自事务源数据库的组织id(或Wiki文章中关于星型架构的store_id)

我认为这些概念需要一些研究和重新阅读来消化,所以我希望你不要匆忙行事。如果做得好,他们需要大量的时间进行规划和设计,但将节省大量的开发时间