论坛类型应用程序的Cassandra数据模型

时间:2014-08-05 10:53:38

标签: database-design cassandra

我正在为论坛类型的应用程序设计数据库。我正在考虑使用Cassandra(我将拥有大量数据,因此RDBMS可能不是一个可行的选择),但坚持如何设计数据库。主要功能是搜索,即搜索关键字,并返回具有该关键字的所有帖子。搜索也可以是用户的某些特征,例如声誉,地理等。

到目前为止我的想法:

  1. 主键:日期和所有其他可搜索功能的复合,例如地理位置,声誉等除了帖子中的文字以外,所有其他功能都可以轻松搜索
  2. 二级索引:将所有单词放在不同的列中,并使所有单词成为辅助索引,以便搜索“关键字”我可以where col1 = keyword or col2 = keyword ...
  3. 所有包含列名称的帖子=邮件发布的第二个帖子(或列名称=帖子ID)
  4. 但我认为这真的是一种全面的方式。有更好的想法吗?

    谢谢!

2 个答案:

答案 0 :(得分:1)

在Cassandra中定义架构对于了解您将要执行的查询非常重要。

1 - 由X字段组成的主键并不意味着您将能够查询主键的任何字段。如果你定义

PRIMARY KEY(reputation, geography, category)

使用此类密钥除非您同时了解声誉和地理位置,否则无法查询类别。除非您了解声誉,否则无法查询地理位置。因此,阅读 left-to-rigth ,您可以将字段置于WHERE条件下。

select * from abc where reputation = 'good';
select * from abc where reputation = 'good' and geography = 'usa';
select * from abc where reputation = 'good'  and geography = 'usa' and category='pizza';

不允许任何其他组合。要在cassandra中解决这个问题,你应该进行非规范化,将数据放入不同的表中。例如3个表有3个不同的主键

table info_by_category ... PRIMARY KEY(category, geography, reputation)
table info_by_reputation ... PRIMARY KEY(reputation, category, geography)
table info_by_geography PRIMARY KEY(geography, reputation, category)

现在,您应该根据where条件选择要查询的表。如果您有声誉和地理位置,则应查询表格info_by_geography,如果您有地理位置和类别,则应转到info_by_category

2 - Cassandra不适合执行全文搜索:要完成这项工作,您应该在数据库旁边使用全文搜索引擎(如solr / elasticsearch / whateveryouprefer)。更多,即使您放置了许多查找索引(以前称为辅助标识符),也无法将它们与AND运算符组合在一起。许多L.I.是一种不推荐使用的行为 - 如果您不能使用全文搜索,我宁愿使用Map,将二级索引放在Map值上。说,您仍然无法使用AND运算符搜索不同的单词。

3 - 可以使用L.I。

轻松完成

HTH,Carlo

答案 1 :(得分:0)

  1. 请记住,只是因为你有很多聚类列并不意味着你可以搜索它们。如果您的主键是(p,c1,c2,c3 ...),那么要在c2上搜索,您必须提供c1。要搜索c3,您必须提供c1和c2 ...

  2. 辅助索引适用于查找分区内的数据。如果您的查询是跨分区,那么您将遇到烦人的麻烦。

  3. 当您对查询有所了解时,Cassandra效果最佳。您可以根据这些查询创建物理数据模型。搜索所有内容的一切都应该留给搜索解决方案。确定您的查询并将该信息保存在cassandra中。使用Solr或ElasticSearch进行任意搜索。

相关问题