我已经为我正在“按书本”构建的网络应用程序设计了数据库。也就是说,我已经:
- 创建了包含应用程序的实体、属性和关系的 E-R 图
- 将 E-R 图转换为模式
- 将架构转换为“无架构”形式以对数据库进行建模(该数据库是 Cassandra (NoSQL) 数据库)。
一切进展顺利(到目前为止)。我之前已经进行过非规范化并取得了很好的结果,并且目前正在实现应用程序的一部分,该部分将使用尚未非规范化的数据。我预测,针对这个特定部分这样做将在一定程度上显着提高性能(从 1 个 Column_Family(关系世界中的“表”)而不是 7 个读取)。
然而,我担心我可能会过度非规范化。如果我对有问题的部分这样做,那么我的应用程序中的 Column_Family/表数量几乎会减少大约 20%,并且由于某种原因,我的数据库的大部分非规范化让我感到紧张。
如果应用程序最终取得足够的成功,我能够让数据库设计者或管理员加入,我希望他能够确定我正在执行的非规范化对于我所实现的性能是必要的寻求(最好的情况)或至少无害(最坏的情况)。
在做出非规范化决策时,我应该注意哪些具体事项,这些事项可能表明这样做是否不好,或者是否总是归结为速度与可维护性?
为 cassandra 设计模式与为 sql 数据库设计模式有很大不同。使用 sql 数据库,您的数据可以存放在一台机器上,数据库将为您维护索引,您可以执行联接,并且可以使用 sql 进行复杂的查询。这些都使得标准化数据变得切实可行。
在 cassandra 中,您的数据不适合一台机器,因此您无法执行联接,您可以有效执行的唯一查询是获取键上的一系列列,并且 cassandra 只会为您维护有限的索引。这使得标准化数据变得不切实际。
在 cassandra 中,您通常设计模式来服务您将要进行的查询,并进行非规范化来做到这一点。我最喜欢的例子是 Twitter 对 Rainbird 的统计数据所做的处理,如下所述post http://news.ycombinator.com/item?id=2181119,
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次查询。
这是一个很好的介绍如何在cassandra中建立索引 http://www.slideshare.net/benjaminblack/cassandra-basics-indexing.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)