文档与列式DB的方案

时间:2013-03-08 12:56:17

标签: database-design nosql document-database

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

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

2 个答案:

答案 0 :(得分:2)

与Ryan提到的一样,数据的访问模式与它有很大关系。由于Ryan覆盖了MongoDB方面(我对此知之甚少),我会给Hbase方面提供一些机会。

对于初学者,我建议你阅读BigTable paper,因为Hbase受其设计的影响很大。该视频还提供了Hbase's design elements的一些详细信息。此外,如果您对Zookeeper更感兴趣,请尝试阅读Chubby Paper

Hbase需要考虑的事项:

索引行:在Hbase(或Cassandra using the Ordered Partitioner)中对行进行“索引”的方式是祝福和诅咒。我相信,mongoDb使用B +树(如果我错了,请纠正我),其中Hbase只按顺序存储行。这种方法适用于map-reduce作业和顺序读取。对于map-reduce作业,它表示运行作业的区域服务器的数据位置。它通过允许磁盘控制器在执行“扫描”密钥时读取磁盘上的顺序扇区来帮助顺序读取。诅咒是数据按顺序存储...因此,如果你没有很好地设计你的行,你最终会有“热”节点。例如,如果您简单地将时间戳用作行键,则最终可能会有一个节点占用所有写入而其他节点处于空闲状态。所以,designing your row-keys in Hbase is very important。这个video on OpenTSDB详细介绍了他们如何使用HBase。

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

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

对于此示例,我们假设我们使用以下密钥存储大量有关访问者的指标    架构(    {产品类别}。{子类别}。{度量}。{时间戳的舍入到一分钟的}    )。例如:单页访问可能会写入以下键:    shoes.running.search-terms.1362818100,    shoes.running.user-agents.1362818100,    shoes.running.visitors-country.1362818100,... SideNote:所有这些键基本上是顺序的,很可能会被写入单个区域服务器,你可能想要    这些写入将分发给多台计算机。一个解决方案    将取代{product-category}。{sub-category}部分    密钥与HashOf({product-category}。{sub-category})。或者像OpenTSDB那样使用密钥查找。

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

编辑:我修了几个拼写错误

答案 1 :(得分:1)

我会冒险回答。我对文档和Mongo有很多经验,但对柱状数据库没有经验。

深度与平坦

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

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

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

同质与异质

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

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

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

“这些系列是表模式的一部分,每行保持不变;行与行的不同之处在于列键可能非常稀疏。”

如果我对HBase不对,也许有人可以纠正我。