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