几天前我在cassandra数据库引擎上听说过,并在上面搜索一个很好的文档.在研究了cassandra后,我得到的cassandra比其他数据引擎更具可扩展性.我也在Amazon SimpleDB上阅读,但由于SimpleDB的限制为10GB/table,而Google Datastore比Amazon SimpleDB慢,我不想使用它们(Google Datastore,Amazon SimpleDB).因此,为了使我们的网站使用大量数据扩展特别高的写入速率,我喜欢使用Cassandra作为我们的数据引擎.
但在开始使用cassandra之前,我对"如何使用casssandra处理复杂数据"感到困惑.我给你下面的MySQL数据库结构,请阅读这个并给我一个很好的建议.
用户表
hasColum ID主要
hasColum电子邮件唯一
hasColum FirstName
hasColum LastName
类别表
hasColum ID主要
hasColum父
hasColum类别
帖子表
hasColum ID主要
hasColum UID索引外键链接到用户 - > ID
hasColum CID索引外键链接到Category-> ID
hasColum Title
hasColum Post Index
hasColum PunDate
注释
hasColum ID primary
hasColum UID索引外键链接到
users- > ID hasColum PID索引外键链接到Posts-> ID
hasColum Comment
用户组
hasColum ID主要
hasColum名称
UserToGroup表(仅限多对多关系)
hasColum UID外键链接到Users-> ID
hasColum GID外键链接到Group-> ID
最后,为了您的信息,我喜欢使用SimpleCassie PHP类http://code.google.com/p/simpletools-php/ 因此,如果您可以使用SimpleCassie给我示例,那将非常有用
从cassandra的wiki数据模型参考:
与关系系统不同,在关系系统中,您可以为实体和关系建模,然后只需添加索引来支持任何必要的查询,使用Cassandra,您需要考虑提前有效支持哪些查询,并进行适当的建模.由于没有自动提供的索引,因此对于每个查询,您将比使用表更接近于一个ColumnFamily:查询关系.不要害怕相应地反规范化;
这里有一篇goog文章.
我希望它对你有所帮助.
我将假设你的系统会有很多负载和大量数据,我将再次假设你已经尝试了一个关系数据库并在重负载下崩溃,数百万行,每秒10k +请求等.
在这些假设之后,我会告诉你,你需要改变你的想法.例如,在您的问题中,您记下了表结构,这在您考虑关系数据库时非常重要.但是在列存储(如cassandra/hbase/etc)中,它并不重要,它的请求类型很重要.因为在列存储中,您总是可以在新列中抛出新的元数据(您不会在请求中使用的额外列,但在响应中),您不必更改设计.但是在关系数据库中,您需要更改表,甚至可以获得另一个具有pk-fk关系的表.
使用cassandra(或任何其他列数据库)时,您应该在您面前拥有所有api.
示例:
如果你有getAllUserPosts($userId)
你的api你应该eighter有:UserPosts ColumnFamily或帖子ColumnFamily上的二级索引(在后台做类似的事情).您还需要如何排序结果?是的,它是设计中的一个关键点,如果你希望它按创建日期排序,那么你最好在密钥或第三方机制中使用TimeUID来为你生成增加的uid.也许你想用他们的"最后更新"对它们进行排序,然后你最好在它上面放一个二级索引.
根据我的经验,我会告诉你,使用cassandra开发一些非常酷的东西,当你的api,或者你需要的数据是清楚的,但当你想要改变一个大的功能,你将面临一些非常大的挑战,当心.还要确保你理解底层的"最终一致性",这使得cassandra很快.因为你必须在键盘上敲打很多次以使交易工作(至少我这样做了).当然,在某些时候你会想要对cassandra上的大量数据进行大规模操作:准备进行肉类云计算.Hadoop的.
PS:我相信这里有很多人对cassandra有很多经验和知识,那么我会帮助你设计出比我更好的系统.我只想分享我在生产中使用cassandra时所经历和理解的内容.