将关系模式转换为 Cassandra 的建议

Posted

技术标签:

【中文标题】将关系模式转换为 Cassandra 的建议【英文标题】:Advice on Converting a Relational Schema to Cassandra 【发布时间】:2015-11-18 20:41:45 【问题描述】:

我希望就如何以最佳方式将典型的关系模式转换为 Cassandra 获得一些建议。关系模式是:

CREATE TABLE IF NOT EXISTS sales (
   sale_id     bigint(20) UNSIGNED NOT NULL
                          AUTO_INCREMENT,
   create_time timestamp  NOT NULL
                          DEFAULT ‘0000-00-00 00:00:00’,
   account     bigint(20) UNSIGNED NOT NULL DEFAULT ‘0’,
   store       char(25)   NOT NULL DEFAULT ‘’,
   product     char(25)   NOT NULL DEFAULT ‘’,
   coupon      char(18)   NOT NULL DEFAULT ‘’,
   amount      decimal(8,2) NOT NULL,
   PRIMARY KEY (sale_id),
   KEY         create_time (create_time) )

我想出的 Cassandra 架构是:

CREATE TABLE sales (
            sale_id     uuid,
            create_time timestamp,
            account     text,
            store       int,
            coupon      text,
            product     text,
            amount      int,
            PRIMARY KEY ((create_time, store), coupon))

(在我需要查询的非键列上创建索引)

典型的查询是按产品/优惠券/帐户/商店在某个时间段内按产品获取所有销售额。

这有意义吗?

关于如何改进这一点以获得合理的读/写性能有什么建议吗?

提前感谢您的任何建议。

【问题讨论】:

【参考方案1】:

不,您希望对 Cassandra 架构进行建模以回答每个问题以获得良好的性能。假设您想按产品查找所有(最近的)销售,并希望将主键创建为 (productID, created_time)

如果您的应用程序通常希望搜索最近销售的产品,那么您希望按 desc 顺序订购集群因子(在您的示例中为created_time)。

同样,您可能会在多个列族中复制您的销售数据。在分布式环境中建模时不要害怕复制数据。您想de-normalize 并期待从分区本身获得结果。

希望这会有所帮助。

【讨论】:

以上是关于将关系模式转换为 Cassandra 的建议的主要内容,如果未能解决你的问题,请参考以下文章

在 Cassandra 中使用轻量级事务 (CAS) 时,我们如何避免丢失写入?

如何将 cassandra 提交日志中的数据转换为可读格式

如何将 Cassandra Map 转换为 Pandas Dataframe

com.datastax.oss -> java-driver-core 和 com.datastax.cassandra -> cassandra-driver-core 之间的 Cas

支持的 Cassandra NoSQL 数据库类型

将 LocalDateTime 转换为 Cassandra TIMESTAMP 时的编解码器问题