我正在为论坛类型的应用程序设计数据库。我正在考虑使用Cassandra(我将拥有大量数据,因此RDBMS可能不是一个可行的选择),但坚持如何设计数据库。主要功能是搜索,即搜索关键字,并返回具有该关键字的所有帖子。搜索也可以是用户的某些特征,例如声誉,地理等。
到目前为止我的想法:
where col1 = keyword or col2 = keyword ...
但我认为这真的是一种全面的方式。有更好的想法吗?
谢谢!
答案 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)
请记住,只是因为你有很多聚类列并不意味着你可以搜索它们。如果您的主键是(p,c1,c2,c3 ...),那么要在c2上搜索,您必须提供c1。要搜索c3,您必须提供c1和c2 ...
辅助索引适用于查找分区内的数据。如果您的查询是跨分区,那么您将遇到烦人的麻烦。
当您对查询有所了解时,Cassandra效果最佳。您可以根据这些查询创建物理数据模型。搜索所有内容的一切都应该留给搜索解决方案。确定您的查询并将该信息保存在cassandra中。使用Solr或ElasticSearch进行任意搜索。