Cassandra数据建模理解

Cassandra data modeling understanding

我来自 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 没有连接,所以你不能这样做 - 如果你需要执行连接,那么它应该在你的应用程序中完成。

Cassandra 鼓励数据反规范化,当你可以将必要的数据复制到另一个 table 以避免在读取数据时加入 - 例如,对于 cart table,你可以复制 price/description 来自 product table,然后在显示购物车时您将不需要查询 product table.

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

建模数据

使用 Cassandra,您需要从构建 table 来支持您的查询开始:

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

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

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)