database - 非规范化:多少算太多?

标签 database database-design cassandra denormalization

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

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

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

但是,我担心我可能过度反规范化了。如果我要对有问题的部分这样做,它会大大减少我的应用程序中的 Column_Family/表计数大约 20%,并且由于某种原因让我的数据库中的大部分非规范化让我感到紧张。

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

在做出反规范化决策时,我是否应该注意一些具体的事情,这些事情可能表明这样做是否会很糟糕,或者它是否总是归结为速度与可维护性?

最佳答案

为 cassandra 设计模式与为 sql 数据库设计模式有很大不同。使用 sql 数据库,您的数据可以放在一台机器上,数据库将为您维护索引,您可以执行连接,还可以使用 sql 进行复杂的查询。这些都使归一化数据变得实用。

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

在 cassandra 中,您通常会设计架构来为您将要进行的查询提供服务,并为此进行非规范化。我最喜欢的例子是 twitter 为他们的 rainbird 所做的统计,如本 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)

这1次点击被复制16次,满足可以做的16次查询。

这是关于 how to do indexing in cassandra 的一个很好的介绍.

关于database - 非规范化:多少算太多?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8513874/

相关文章:

mysql - 这种 SQL 结构(在 mysql 数据库中)在现实世界模型中是否有效?

database - 无法修复 Cassandra 中特定节点上的特定表

php - 每天多次在 PHP 中可扩展地处理大量复杂的数据库数据

android - 如何设计 SQLite DB 使其可用于多种语言?

scala - 使用 scala 转换 Spark 中的数据时,多个构造函数具有相同数量的参数异常

mysql - 如何获取MAX函数对应的列值?

mysql - MySQL 中的二进制数据

database - Oracle 10g 临时表

java - 如何通过 Java 身份验证连接到 Cassandra 5.1

sql - Spark 1.3 中未找到命令策略类