文档与列式DB的方案

Pra*_*ati 5 database-design nosql document-database

NoSQL数据库可以分类为KV,Document,Columnar和Graph.我一直试图弄清楚哪些NoSQL用于不同的场景,阅读几篇博客/文章,我仍然感到困惑.

让我们说我想存储员工的详细信息.它可以存储在像HBase这样的Columnar DB和像Mongo这样的Document DB中.那么,Columnar与Document的情况是什么?我想根据查询模式,必须选择适当的数据库.

eSn*_*iff 6

正如 Ryan 提到的,数据的访问模式与此有很大关系。由于 Ryan 介绍了 MongoDB 方面(我对此知之甚少),因此我将尝试一下 Hbase 方面。

对于初学者,我建议您阅读BigTable 论文,因为 Hbase 深受其设计的影响。该视频还介绍了Hbase 设计元素的一些很好的细节。另外,如果您对 Zookeeper 更感兴趣,也可以尝试阅读Chubby Paper

Hbase 需要考虑的事项:

索引行:在 Hbase(或使用 Ordered Partitioner 的 Cassandra )中“索引”行的方式是它的祝福和诅咒。我相信,mongoDb 使用 B+Tree(如果我错了,请纠正我),其中 Hbase 只是按顺序存储行。这种方法非常适合映射缩减作业和顺序读取。对于 Map-Reduce 作业,这意味着运行作业的区域服务器的数据局部性。它允许磁盘控制器在执行键“扫描”时读取磁盘上的连续扇区,从而有助于顺序读取。问题是数据是按顺序存储的......所以如果你没有很好地设计你的行,你最终会得到“热”节点。例如,如果您简单地使用时间戳作为行键,则最终可能会导致一个节点接受所有写入,而其他节点则闲置。因此,在 Hbase 中设计行键非常重要OpenTSDB 上的这段视频详细介绍了他们如何使用 HBase。

列式数据库的另一个优点是它们可以使用列压缩而不是行压缩。通常,列的熵远低于行的熵。因此它使压缩更加有效。例如,如果您的列存储 UserAgents、URL、关键字...,它们的压缩效果会非常好。

Hbase 解决方案示例: 假设您想要创建一个解决方案来跟踪电子商务网站上的访问者数据,并要求支持任何日期范围内的聚合。由于 Hbase 在磁盘上以顺序方式存储密钥,因此如果您的密钥设计良好,Hbase 可能会为您提供更好的创建实时顺序扫描的性能。

对于此示例,假设我们使用以下关键架构存储了大量有关访问者的指标 ( {product-category}.{sub-category}.{metric}.{timestamp-rounded-to-the-month} )。例如:单页访问可能会写入以下键:shoes.running.search-terms.1362818100、shoes.running.user-agents.1362818100、shoes.running.visitors-country.1362818100、... 旁注:全部这些密钥基本上是连续的,并且很可能会写入单个区域服务器,并且您可能希望将这些写入分发到多台计算机。一种解决方案是将键的 {product-category}.{sub-category} 部分替换为 HashOf( {product-category}.{sub-category} )。或者像 OpenTSDB 那样使用键查找。

因此,通过这种关键设计,可以快速运行这些指标的临时/实时查询。例如,要查询 1331666259(星期二,2012 年 3 月 13 日)到 1334344659(星期五,2012 年 4 月 13 日)之间使用的所有搜索词,您可以发出扫描 ( Shoes.running.search-terms.13331666259Shoes.running .搜索术语.1334344659

编辑:我修正了几个错别字


rya*_*234 3

我冒昧地回答一下。我在文档和 Mongo 方面有相当多的经验,但在列式数据库方面没有经验。

深度与平坦

我的第一个建议是文档可以有嵌套的子文档,并且柱状数据库可能是严格的平面记录。

但读完这篇文章后: http: //wiki.apache.org/cassandra/DataModel,似乎某些列式数据库也可以具有记录深度。

事实上,如果您阅读有关 Cassandra 的页面,您会发现它们通常将概念记录表示为 JSON。因此,从这个意义上说,数据建模之间似乎没有区别——至少从概念角度来看是这样。

同质与异质

另一个巨大的潜在差异是一个集合/表中的同质数据模型与异构数据模型。

Mongo 允许您将具有不同模式的文档存储在数据库的同一集合中。

据我所知,HBase 的每一行都必须具有相同的表模式。从列族部分(http://wiki.apache.org/hadoop/Hbase/DataModel):

“族是表模式的一部分,并且每一行都保持相同;行与行之间的不同之处在于列键可能非常稀疏。”

如果我对 HBase 的理解有误,也许有人可以纠正我。