请注意我第一次使用NoSQL,几乎每个概念都是NoSQL世界的新概念,很长一段时间来自RDBMS!
在我的一个重度使用的应用程序中,我想将NoSQL用于某些部分数据,并从MySQL中移出,其中事务/关系模型没有意义。我得到的是,C AP [可用性和分区容差]。
目前的数据模型很简单,因为
ID (integer) | ENTITY_ID (integer) | ENTITY_TYPE (String) | ENTITY_DATA (Text) | CREATED_ON (Date) | VERSION (interger)|
我们可以放心地假设这部分应用类似于活动的记录! 我想根据我的要求将其移至NoSQL,并与Performance Oriented 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/
答案 0 :(得分:2)
让我解释一下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 .... );
请注意主键。指定了多个列。第一列是分区键。所有&#34;行&#34;在一个分区中存储在一起。在分区内,数据按主键中的第二个键,然后是第三个键,然后是第四个键排序。这些称为群集密钥。要查询,您几乎总是命中一个分区(通过在where子句中指定相等性)。然后,在所选分区上完成查询中的任何其他过滤器。如果您没有指定分区键,则可以进行群集范围的查询,这可能很慢或很可能超时。点击分区后,您可以按顺序过滤后续键上的匹配项,并在查询中指定的最后一个集群键上进行范围查询。无论如何,这都是关于查询的。
就结构而言,您有几种列类型。一些原语如text,int等,还有三个集合 - 集合,列表和映射。是的,地图。在集合中使用时,UDT通常更有用。例如一个人可能有一张地址图:地图。如果需要查询信息或对其进行索引,或者您知道每行都有这些列,您通常会将信息存储在列中。您也可以自由使用地图栏,这样您就可以随意存储&#34;任意&#34;键值数据;这就是你想要做的事情。
需要注意的一件事......您的主键每个记录都是唯一的。如果您使用相同的pk进行另一次插入,则不会出现错误,它只会覆盖现有数据。卡桑德拉的一切都是一种甜言蜜语。并且您无法更改任何行的主键中任何列的值。
你提到查询不是一个因素。但是,如果您确实发现自己需要进行聚合,那么您应该查看Apache Spark,它与Cassandra非常兼容(并且还支持关系数据源....因此您应该能够跨mysql和cassandra聚合数据以进行分析)。
最后,如果您的数据是时间序列日志数据,那么cassandra是一个非常好的选择。