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是一个非常非常好的选择。
请注意,我是第一次使用 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是一个非常非常好的选择。