非规范化:多少钱?

时间:2011-12-15 01:06:48

标签: database database-design cassandra denormalization

我为我正在“按书”构建的网络应用程序设计了数据库。也就是说,我:

  • 创建了包含应用实体,属性和关系的E-R图
  • 将E-R图转换为架构
  • 将架构转换为“无架构”形式以使用(数据库是Cassandra(NoSQL)数据库)对数据库建模。

一切进展顺利(到目前为止)。我之前已经非常规化了很好的结果,并且我正在实施应用程序的一部分,它将使用尚未非规范化的数据。我预测,对于这个特定部分这样做会大大提高性能(从1 Column_Family(关系世界中的“表格”)而不是7)中读取。

然而,我担心我可能会过度反正规化。如果我要对相关部分这样做,那么我的应用程序中的Column_Family / table计数几乎会减少大约20%,并且我的数据库非常规化的数量会让我感到紧张。

如果应用程序最终成功,我能够让数据库设计师或管理员加入,我希望他能够确定我正在执行的非规范化对于性能是必要的我正在寻求(最佳情况)或至少无害(最坏情况)。

在进行非规范化决策时,我应该注意哪些具体事项可能表明这样做是否会很糟糕,还是总是降低速度与可维护性?

3 个答案:

答案 0 :(得分:10)

为cassandra设计模式与为sql数据库设计模式有很大不同。使用sql数据库,您的数据适合一台机器,数据库将为您维护索引,您可以执行连接,并且您可以使用sql执行复杂查询。这些都使规范化数据变得切实可行。

在cassandra中,您的数据不适合一台机器,因此您无法执行连接,您可以有效地执行的唯一查询是获取键上的一系列列,而cassandra将只为您维护有限的索引。这使得规范化数据变得不切实际。

在cassandra中,您通常会设计架构来提供您要进行的查询,并进行反规范化以执行此操作。我最喜欢的例子是twitter为他们的雨鸟统计数据所做的事情,如post中所述,

For example, say someone clicks on a t.co link to blog.example.com/foo at 11:41am on 1st Feb. 
Rainbird would increment counters for:

 t.co click: com (all time)
 t.co click: com.example (all time)
 t.co click: com.example.blog (all time)
 t.co click: com.example.blog /foo (all time)
 t.co click: com (1st Feb 2011)
 t.co click: com.example (1st Feb 2011)
 t.co click: com.example.blog (1st Feb 2011)
 t.co click: com.example.blog /foo (1st Feb 2011)
 t.co click: com (11am-12 on 1st Feb)
 t.co click: com.example (11am-12 on 1st Feb)
 t.co click: com.example.blog (11am-12 on 1st Feb)
 t.co click: com.example.blog /foo (11am-12 on 1st Feb)
 t.co click: com (11:41-42 on 1st Feb)
 t.co click: com.example (11:41-42 on 1st Feb)
 t.co click: com.example.blog (11:41-42 on 1st Feb)
 t.co click: com.example.blog /foo (11:41-42 on 1st Feb)

这一次点击被复制16次,以满足16个可以完成的查询。

这是关于how to do indexing in cassandra的一个很好的演示文稿。

答案 1 :(得分:1)

通常,您希望尽可能多地进行规范化,尤其是与您认为可能会变大的表格相关的规范化。我已经跳过了非常小的数据集或直接相关数据的规范化,但从未改善性能原因(这就是报告服务器和ETL的用途);我发现设计上的额外努力和重新加入非常小的,直接相关的,很少变化的表是从开发角度来看浪费时间。

我对非规范化的最大担忧是数据完整性和空间浪费(在磁盘和内存上)。

我对标准化的唯一关注是可维护性;制作非常简单的东西比实际需要的要复杂得多,一般都没有结果。为了正常化,规范化是我所关注的狂热分子,而且只有西斯在绝对中的交易。

答案 2 :(得分:1)

为了性能而非规范化并不是一件坏事。您需要考虑的是应用程序/数据库的目标,以及规范化如何帮助您实现它们。

首先,在1NF中放置一个表涉及消除冗余数据或(Coronel,Rob 2009)"重复组。"消除多个位置(无论是其他表或行)中的数据是一件好事,并有助于维护,数据完整性和性能。

获取2NF涉及消除部分依赖关系。当您有一个复合键(由多个键字段组成的主键)和其值仅由一个或部分键确定的字段时,存在部分依赖关系。通常,消除部分依赖性是您开始查看为处理多对多关系而创建的桥表的地方。

<3> 3NF更进一步,因为它消除了所有传递依赖关系或依赖于非关键字段值的字段。此步骤通常可以以性能的名义进行协商。根据传递字段值的大小或方差,您希望减轻将这些值保留在表格中的挑战,以及您必须加入以获取它的频率。

底线,消除冗余数据和相关数据(部分和传递)是一件好事。但是,不要让它阻止你做对你的应用有意义的事情。

℃。 Coronel,P。Rob(2009),&#34; Database Systems:Design Implementation and Management&#34;,Course Technology,Boston,MA(Ch.5)

相关问题