Cassandra 卡桑德拉数据建模理解

Cassandra 卡桑德拉数据建模理解,cassandra,cql,Cassandra,Cql,我来自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 > SELECT product_name,product_price,product_desc

我来自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
> 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)
但在卡桑德拉,这是不同的还是我错了? 我能在卡桑德拉也做他的吗,还是很糟糕?
如何在Cassandra中查询多个表?

Cassandra没有联接,因此您无法执行此操作-如果需要执行联接,则应在应用程序中执行

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


我建议你阅读《卡萨桑德拉:权威指南,第三版》的第一章——这是一本很好的书。这将有助于您了解如何为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\u id
存储在一起。因为它是第一个主键,所以它成为分区键。由于我希望每个购物车有多个产品,
product_id
需要作为集群列作为键的一部分,以确保唯一性

插入一些数据后,这将起作用:

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
> 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
item\u id
还需要包括
产品表中的相关列,例如:
price
&
name
我指的是一个代码示例,我如何使用cassandra复制一个表语法^^^您需要使用代码或使用DSBulk之类的工具来完成这一操作谢谢您的回答。我明白这一点,但我怎么能对另一张桌子说话呢?我的意思是,如果我想添加一个用户ID来查看哪个用户创建了购物车。@localdata01您不能。您需要预先了解所有查询,并构建一个表来支持它。@localdata01在retrospect中,您可以通过添加一个新列并在其上构建二级索引来实现这一点。但这不会很好。我读到卡桑德拉不适合支付交易和很多更新。我应该使用RDBMS吗?基本上,首先编写查询并设计表来回答查询。请取消表的规范化,不要太担心数据的复制。