将关系模式转换为 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 Map 转换为 Pandas Dataframe
com.datastax.oss -> java-driver-core 和 com.datastax.cassandra -> cassandra-driver-core 之间的 Cas