非规范化:多少钱?

Kev*_*vin 3 database database-design denormalization cassandra

我已经为我正在"按书"构建的网络应用程序设计了数据库.也就是说,我:

  • 创建了包含应用程序实体,属性和关系的ER图
  • 将ER图转换为模式
  • 将模式转换为"无模式"形式以使用(数据库是Cassandra(NoSQL)数据库)对数据库建模.

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

但是,我担心我可能会非常规范化.如果我要对相关部分这样做,它几乎会将我的应用程序中的Column_Family/table计数减少大约20%,并且由于某种原因,我的数据库非常规化了很多.

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

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

sbr*_*ges 10

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

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

在cassandra中,您通常会设计模式以提供您要进行的查询,并进行非规范化以执行此操作.我最喜欢的这个例子是什么做的Twitter为自己的统计信息润邦在这个解释,

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)
Run Code Online (Sandbox Code Playgroud)

这1次单击被复制16次,以满足可以完成的16个查询.

这是关于如何在cassandra中进行索引的一个很好的演示.