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)
我来自 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)