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



我正在设计一个论坛类型的应用程序数据库。我正在考虑使用Cassandra(我将有大量的数据,所以RDBMS可能不是一个可行的选择),但卡在如何设计数据库。主要功能将是搜索,即搜索关键字和所有帖子与该关键字将返回。还可以根据用户的某些特征进行搜索,例如声誉、地理位置等。

到目前为止我的想法:

  1. 主键:日期和所有其他可搜索特征的组合,例如地理,声誉等,除了帖子中的单词,以便所有其他特征都可以轻松搜索
  2. 次要索引:将所有单词放在单独的列中,并使它们成为次要索引,因此搜索"关键字",我可以做where col1 = keyword or col2 = keyword ...
  3. 列名称=消息发布的第二次(或列名称=帖子id)的所有帖子

但是我认为这是一种绕圈子的方式。有更好的主意吗?

谢谢!

要在Cassandra中定义一个模式,知道你要做什么查询是非常重要的。

1 -由X个字段组成的主键并不意味着你可以查询主键的任何字段。如果你定义了

PRIMARY KEY(reputation, geography, category)

使用这样的键,除非您知道声誉和地理位置,否则您无法查询类别。除非你知道名声,否则你无法查询地理。因此,从左到右读取,您可以将字段置于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,卡洛

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

  2. 二级索引适合于查找分区内的数据。如果你的查询是跨分区的,你会遇到麻烦。

当你对你的查询有一个想法时,Cassandra工作得最好。您可以根据这些查询创建物理数据模型。在所有东西上搜索所有东西是应该留给搜索解决方案的事情。确定您的查询并将该信息保存在cassandra中。使用Solr或ElasticSearch进行任意搜索

最新更新