Cassandra 数据模型的一种方法



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

在我的一个大量使用的应用程序中,我想将NoSQL用于某些数据部分,并从MySQL中移出,其中事务/关系模型没有意义。我会得到的是,CAP [可用性和分区容错]。

本数据模型简单如下:

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

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

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

在阅读了 Cassandra 中的用户定义类型后,我是否可以将UserDefinedType用作值,它本质上是利用一个键和多个值!否则,将其用作普通列级别,无需UserDefinedType!一个想法是跨系统对不同的应用程序使用相同的模型,其中简单的日志记录/活动数据可以推送到相同的,因为键因应用程序而异,并且在应用程序内每个实体都是唯一的!

没有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 .... );

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

在结构方面,您有几种列类型。一些原语,如文本、int 等,但也有三个集合 - 集合、列表和映射。是的,地图。在集合中使用 UDT 时通常更有用。例如,一个人可能有一个地址地图:地图。如果需要查询信息或索引信息,或者您知道每一行都有这些列,则通常会将信息存储在列中。您还可以自由使用映射列,该列可让您存储"任意"键值数据;这似乎是你想做的。

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

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

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

相关内容

最新更新