Cassandra 数据模型的一种方法

An Approach to Cassandra Data Model

请注意,我是第一次使用 NoSQL,在这个 NoSQL 世界中,几乎每个概念都是新的,很长一段时间都来自 RDBMS!

在我经常使用的应用程序之一中,我想对部分数据使用 NoSQL 并从 MySQL 中移出,其中 transactions/Relational 模型没有意义。我会得到的是,CAP [可用性和分区容错].

现在的数据模型就这么简单

ID (integer) |  ENTITY_ID (integer)  |  ENTITY_TYPE (String)  | ENTITY_DATA (Text)  | CREATED_ON (Date) | VERSION (interger)|

我们可以安全地假设这部分应用程序类似于活动的日志记录! 我想根据我的要求将其移至 NoSQL,并与面向性能的 MySQL 数据库分开。

Cassandra 说,里面的一切都很简单Map<Key,Value> type!从地图级别考虑, 我可以使用 ENTITY_ID|ENTITY_TYPE|ENTITY_APP 作为键并将其余数据存储在值中!

读完 Cassandra 中的用户定义类型后,我可以使用 UserDefinedType 作为值,它本质上是利用一键和多个值!否则,将其用作没有 UserDefinedType 的正常列级别!一个想法是对跨系统的不同应用程序使用相同的模型,这很简单 logging/activity 数据可以被推送到相同的地方,因为密钥因应用程序而异,并且在应用程序内每个实体都是唯一的!

没有application/business没有Key访问这个数据的功能,或者简单来说不需要随机获取数据!

参考文献:http://www.ebaytechblog.com/2012/07/16/cassandra-data-modeling-best-practices-part-1/

让我稍微解释一下 cassandra 数据模型(或至少是其中的一部分)。您可以像这样创建表:

create table event(
   id uuid,
   timestamp timeuuid,
   some_column text,
   some_column2 list<text>,
   some_column3 map<text, text>,
   some_column4 map<text, text>,
   primary key (id, timestamp .... );

记下主键。指定了多个列。第一列是分区键。一个分区中的所有 "rows" 存储在一起。在分区内,数据按主键中的第二个、第三个、第四个……键排序。这些称为集群键。要查询,您几乎总是会命中一个分区(通过在 where 子句中指定相等性)。然后在所选分区上完成查询中的任何进一步筛选。如果不指定分区键,则会进行集群范围的查询,这可能会很慢或很可能会超时。命中分区后,您可以按顺序过滤后续键的匹配项,并在查询中指定的最后一个集群键上进行范围查询。反正查询就到这里了

就结构而言,您有几种列类型。一些基本类型,如 text、int 等,还有三个集合 - sets、lists 和 maps。是的,地图。 UDT 通常在集合中使用时更有用。例如一个人可能有一张地址地图:地图。如果您需要对其进行查询或索引,或者您知道每一行都会有这些列,您通常会将信息存储在列中。您还可以自由使用映射列,它可以让您存储 "arbitrary" 键值数据;这就是你想要做的。

需要注意的一件事...您的主键在每条记录中都是唯一的。如果您使用相同的 pk 进行另一次插入,则不会出现错误,它只会覆盖现有数据。 cassandra 中的所有内容都是一个 upsert。而且您将无法更改任何行的主键中任何列的值。

您提到查询不是一个因素。但是,如果您确实发现自己需要进行聚合,则应该查看 Apache Spark,它与 Cassandra 配合得很好(并且还支持关系数据源....因此您应该能够跨 mysql 聚合数据和用于分析的 cassandra)。

最后,如果你的数据是时序日志数据,cassandra是一个非常非常好的选择。