杨浦建设机械网站,wordpress插件外链,关键词查询工具,20平米的办公室怎样装修标准化数据模型
标准化被定义为减少或消除数据集中冗余的过程。
它已成为关系数据库中数据建模的事实上的方法#xff0c;很大程度上是由于这些系统最初设计时所围绕的底层资源限制#xff1a;缓慢的磁盘和昂贵的 RAM。更少的数据冗余/重复意味着更有效地从磁盘读取数据并占…标准化数据模型
标准化被定义为减少或消除数据集中冗余的过程。
它已成为关系数据库中数据建模的事实上的方法很大程度上是由于这些系统最初设计时所围绕的底层资源限制缓慢的磁盘和昂贵的 RAM。更少的数据冗余/重复意味着更有效地从磁盘读取数据并占用更少的空间。甚至一些像 Cassandra 这样的 NoSQL 数据库也鼓励采用非常标准化的方法来存储数据。
规范化通常需要创建一系列表每个表可以有一组不同的字段但给定表中的每条记录必须为其所有字段都有一个值 - 不多也不少。任何具有相当复杂的数据模型的应用程序最终都会将该数据分割到 10 个如果不是 100 个甚至 1000 个表中。在这些表中数据通过“关系”链接在一起即表 1 中存储的记录包含到表 2 中记录的链接。这些表、字段和关系就是所谓的“模式”。
标准化数据确实提供了一些好处
重复数据删除存储给定值一次并从多个位置引用它可以节省存储空间。一致性同样更新仅存储在一个位置并从其他位置引用的值意味着更新可以应用一次并且不存在不一致。数据完整性规范化通常与数据库仅接受与正确字段有时甚至是这些字段的数据类型匹配的传入数据的能力相关。然而我认为虽然这是一项有益的功能但它并不是直接源于规范化数据模型而是源于底层实现。
然而它也有一些缺点
当数据进入系统时必须将其划分到这些众多的表中并且确保所有内容一起更新即事务和关系完整性可能会占用大量资源。当应用程序请求多个数据点时需要复杂即慢速JOIN 将多个表中的值拼凑在一起。表中的所有记录必须相同这使得存储不同结构的数据非常具有挑战性几乎不可能。引入与当前模型不同格式的数据需要新表并且从一种结构更改为另一种结构可能需要大量停机时间。阻抗不匹配现代应用程序处理数据即对象的方式与在数据库中存储或检索数据的方式非常不同。
非规范化数据模型
另一方面我们有非规范化这是一种通常用于通过将类似数据分组在一起来提高性能的策略。历史上数据被非规范化通过避免跨表的复杂 JOIN 的需要来提高数据仓库中的报告性能。这带来了在多个模型中保持数据最新的额外挑战但我们将在另一天再讨论脆弱的 ETL 管道。
在一些现代即NoSQL数据库中非规范化被吹捧为解决关系数据库挑战的灵丹妙药。开发人员被告知要对一切进行非规范化以便获得现代 Web 和移动应用程序所需的灵活性和性能。对于简单的数据模型这很容易做到并且确实提供了显着的好处。然而对于更复杂的数据模型它实际上会使开发变得更加困难。
非规范化的好处是
减少阻抗失配对于简单应用模式从一个记录到另一个记录的轻松变化通过一次性插入所有相关数据并删除跨表的 JOIN 进行检索提高了性能。
然而它也有权衡
数据重复相同的值在整个数据库中多次重复增加了存储和处理要求。数据不一致数据重复意味着更新一个值需要在多个位置更改该值。由于这通常无法一次全部完成或至少不能大规模完成因此在进行更新时结果不一致难以对复杂关系进行建模实际上增加了企业应用程序的阻抗失配。复杂应用程序的多个组件都需要在不同时间以不同方式操作相同的数据。强迫他们在一个记录中合作或竞争实际上是不可能的。
讽刺的是正如由于 RAM 和磁盘的限制而开发规范化数据模型一样非规范化的建议也是从一些早期 NoSQL 技术的缺陷出发不支持跨表的高效 JOIN缺乏强一致性即使在单个记录上以允许记录之间的引用。
混合标准化/非标准化数据模型
Couchbase 的一个非常强大的方面是它支持多种混合规范化和非规范化数据类型。通过 JSON 可以轻松实现非规范化而通过支持 JOIN 和强一致性可以轻松实现规范化……并且两者可以并存。 完全规范化的数据模型可以在多个订单中实现良好的重复数据删除。然而在系统上线后为每个客户添加第二个或第三个、第四个等地址字段将是相当具有挑战性的。或者也许只为某些产品而不是其他产品添加评论。另一方面完全非规范化的数据模型使得一个客户拥有 1 个地址而另一个客户拥有 2 个地址变得非常容易。但是在所有订单中更新产品描述可能会非常密集即缓慢并导致两个根据查询数据库的时间对同一产品有不同的描述。它还会导致客户详细信息以及产品名称和描述的大量重复从而需要更多的资源来存储、处理、备份等。 使用 Couchbase可以在同一模式中同时拥有规范化和非规范化数据模型。这些数据在有意义的地方进行标准化使用订单到产品和客户的参考来避免任何数据重复或不一致。它还在有意义的地方进行了非规范化将所有客户数据保存在一个记录中并允许不同的客户拥有不同的信息。它甚至是同一记录中两者的混合虽然订单引用产品和客户但它们还包含该订单中包含的任意项目列表。这很有道理。
只有当使用的数据库不仅能够支持强一致性而且还能够具有强大的查询语言来表达数据记录之间的复杂关系时这才有可能实现。