如何解决Cassandra 数据建模理解
我来自 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 鼓励数据非规范化,当您可以将必要的数据复制到另一个表中以避免在读取数据时加入 - 例如,对于 cart
表,您可以从 product
表中复制价格/描述,然后在显示购物车时,您将不需要查询 product
表。
我建议阅读“Casasndra:权威指南,第 3 版”一书的第一章 - 它是 freely available。这将帮助您了解如何为 Cassandra 建模数据
,使用 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
存储在一起。因为它是第一个主键,所以它变成了分区键。由于我打算每个购物车有多个产品,因此 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)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。