这是更快的非标准化数据库或第三范式数据库

时间:2013-02-12 20:46:08

标签: sql database normalization

干草我正在做一篇关于数据库速度的论文,因为我被告知有几家公司已经将具有第三种普通表格布局的表格切换到单个表格以保存数据,因为我被告知它是更快地访问和监视数据。

所以在我的论文中,我决定通过创建包含相同数据的3个septate数据库来测试这个

  1. 包含1个表格中的所有数据
  2. 将数据分为2个表中的关系
  3. 将数据分为3个表中的关系
  4. 我将在每个上运行一个查询,它将选择一个值并拉回整个行和连接的记录。

    无论如何我想知道你是否可以给我任何网站/页面或书籍/ jernals,要么说标准化数据库比非标准化数据库更快

1 个答案:

答案 0 :(得分:2)

我有几年在数据仓库领域使用高度非规范化数据库的经验(如果你想了解非规范化应用的场景,你应该阅读它),以及使用传统应用程序做几年的工作OLTP。

你说公司选择切换到单个非规范化表格,因为它的读写速度更快。在大多数情况下,绝对更快。想象一下,如果你对一个地区/员工表进行非规范化。该表中的区域记录将重复数千次。如果必须更改单个区域(例如它的名称),那么当标准化数据库只需要更新一条记录时,您将在数千条记录中应用该更新。这有许多严重的性能问题。一,在任何类型的交易中,对区域的更新都会导致数千个员工记录以某种方式被锁定(取决于交易的类型)。快照事务会消耗更多的内存。区域列上的索引会比必要的大得多。由于每个表只有一个聚簇索引,因此您的索引优化策略将受到限制。使用规范化数据库,您可以更灵活地对单独表进行物理排序。

最重要的是要理解的是,您无法评估一个用例(例如选择单个记录),然后得出结论设计1,2或3是最佳的。这样的测试并不代表典型的使用场景。如果您选择单个记录,那么很可能您正在处理OLTP方案,您可以在其中选择AND可能编辑单个记录。在这种情况下,如果您的测试中没有包含最常见的CRUD操作,那么您的测试将非常不切实际:

  • 单个插入
  • 单次更新
  • 单删除
  • 数以千计的并发操作

此外,您必须考虑到数千个这些操作将同时发生的事实,因此死锁和等待锁将导致非规范化数据库执行得非常糟糕。当您考虑到这种常见的使用场景时,这将产生巨大的差异。

并且通过“单一”,我并不是指整个非规范化记录,我的意思是它只代表一个实体的部分。例如,更新或删除某个区域,但保留该记录的员工部分,这将使您的代码更加复杂,并且性能会很差。

您可以评估的另一个方案是OLAP,而不是OLTP,它是Data Warehousing的主题领域。虽然有使用多维数据集的OLAP数据库引擎,但您可以使用OLTP引擎实现数据仓库,但使用非规范化设计。通常,您不会将所有内容归一化为单个表。通常你有一个非规范化的事实表,然后是其他连接到它的表,这些表也是非规范化的,以防止有多个连接的场景从事实表到任何其他数据。 这种非规范化设计的使用场景几乎从来都不是单一的记录!通常你聚合了大量的记录(按数百万的顺序)并且以一种方式对结构进行非规范化事情,最小化连接,并最小化记录大小(最大化每页的记录)。因此,您可以从“事实”表中获得最大吞吐量。除此之外还有更多的东西。数据仓库领域非常广泛,在决定如何对数据进行非规范化时需要评估很多事情。好消息是它刚刚被归结为一门科学。 Kimball的“Date Warehousing Toolkit”是一本很棒的书,虽然它在概念方面有点太过分了,但不会详细介绍实现细节。

关键是,您应该认识到没有最好的设计宣称,有很多混合设计,并且每种设计都有适合的使用场景。

如果我是你,我会澄清我的propspectus,仅涵盖对一种使用场景的调查,并承认存在其他数据库设计可能表现更好的其他使用场景。但是,在我看来,执行单个记录选择并不包括完整的使用场景,应包括我为OLTP列出的其他常见操作。

或者您可以使用数据仓库使用方案,但问题在于您确实需要良好的数据仓库设计技能才能进行公平的比较。即使是最合适的汇总报告使用场景,也很容易以一种产生不良结果的方式对数据库进行非规范化。