【问题标题】:Cassandra data modeling understandingCassandra 数据建模理解
【发布时间】:2021-08-26 12:58:53
【问题描述】:

我来自 SQL,现在切换到 CQL。我还不太明白。

在 SQL 中这是有效的:

Table product
id,
 name, 
 desc,
 price

Table cart
  id 
  item_id

SELECT
  p.name,
  p.desc,
  p.price

FROM product

INNER JOIN cart
ON c.item_id = p.id

但是在 Cassandra 中是不同的还是我错了? 我也可以在 Cassandra 做他的,还是那很糟糕? 如何在 Cassandra 中查询多个表?

【问题讨论】:

  • 基本上,首先编写您的查询并设计表格来回答查询。请对表进行反规范化,不要太担心数据的复制。

标签: cassandra cql


【解决方案1】:

使用 Cassandra,您需要先构建一个表来支持您的查询:

SELECT * FROM product
INNER JOIN cart
ON c.item_id = p.id

当然没有任何连接,所以我们必须构建一个表来存储购物车产品数据:

CREATE TABLE cart_product (
    product_name TEXT,
    product_desc TEXT,
    product_price DECIMAL,
    product_id uuid,
    cart_id uuid,
    qty int,
    PRIMARY KEY (cart_id,product_id)
);

通过像这样定义我的主键,我确保我的所有行都将由cart_id 存储在一起。因为它是第一个主键,所以它成为 partitioning 键。由于我打算每个购物车拥有多个产品,product_id 需要作为聚类列作为键的一部分以确保唯一性。

插入一些数据后,这工作:

> SELECT product_name,product_price,product_desc 
  FROM cart_product
  WHERE cart_id=93aefdf3-acbf-4d3c-849c-4db9b2ef9e19;

 product_name         | product_price | product_desc
----------------------+---------------+---------------------------------------------------
            Minecraft |         29.99 | Build the future with blocks, and try not to die!
 Kerbal Space Program |         29.99 |         Blast into space.  Now with moar rockets!
       Cyberpunk 2077 |         59.99 |         Wake up Samurai.  We have a city to burn!

(3 rows)

【讨论】:

  • 感谢您的回答。我明白这一点,但我怎么能和另一张桌子说话?我的意思是如果我想添加一个用户 ID 来查看哪个用户创建了购物车。
  • @localdata01 你不能。您需要预先了解所有查询,并构建一个表来支持它。
  • @localdata01 回想起来,您可以通过添加新列并在其上构建二级索引来实现这一点。但这不会很好。
  • 我读到 cassandra 不适合支付交易和很多更新。我应该使用 RDBMS 吗?
【解决方案2】:

Cassandra 没有连接,所以你不能这样做 - 如果你需要执行连接,那么它应该在你的应用程序中完成。

Cassandra 鼓励数据非规范化,当您可以将必要的数据复制到另一个表中以避免在读取数据时加入 - 例如,对于 cart 表,您可以从 product 表中复制价格/描述,然后在显示时您不需要查询product 表的购物车。

我建议阅读“Casasndra:权威指南,第 3 版”一书的第一章 - 它是 freely available。这将帮助您了解如何为 Cassandra 建模数据

【讨论】:

  • 感谢您的回答。我会花时间阅读那本书,但在此之前你能告诉我我是如何复制它的吗?
  • 基本上,您的购物车表除了iditem_id 还需要包含product 表中的相关列,即:price & name
  • 我的意思是一个代码示例,我如何使用 cassandra 复制表,语法 ^^
  • 您需要使用代码或使用 DSBulk 等工具来完成此操作
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-12-25
  • 2015-04-09
  • 2015-04-05
  • 1970-01-01
  • 2019-09-02
  • 2018-06-16
相关资源
最近更新 更多