【问题标题】:One to many mapping in Cassandra(Ecomerce data schema)Cassandra 中的一对多映射(Ecomerce 数据模式)
【发布时间】:2020-09-23 19:33:23
【问题描述】:

我是 cassandra db 的新手,我正在制作简单的电子商务模式。在关系世界中,我们有以下模式 类别表(id,名称), 产品表(id,categoryId,name,price,discounted_price)

所以在 cassandra 中,如果我有以下查询,我该如何建模我的数据

  1. 选择所有类别;
  2. 选择所有产品;
  3. 选择具有类别名称的特定产品
  4. 选择特定类别及其产品

如果我更新类别名称会影响所有表吗?

【问题讨论】:

  • 我不建议您将 Cassandra 用于您的用例,因为: - “全选”查询 - Cassandra 是一个分布式数据库,只有当您有允许 Cassndra 的查询条件时它才会正常工作定义数据的放置位置。全扫描查询对于分布式数据库来说不是一个好主意,因为它涉及到对所有节点的请求。 - “更新”查询和关系数据。 Cassndra 不提供事务机制,因此保持多个表之间的数据一致性可能是个问题

标签: database cassandra nosql data-modeling


【解决方案1】:

这是一个可能的数据模型:

CREATE TABLE categories (
    category_id text,
    category_name text,
    ...
    PRIMARY KEY (category_id)
)

CREATE TABLE products (
    product_id text,
    category_id text,
    product_name text,
    category_name text,
    price decimal,
    discounted_price decimal,
    PRIMARY KEY (product_id)
)

CREATE TABLE products_by_category (
    category_id text,
    product_id text,
    product_name text,
    category_name text,
    PRIMARY KEY ((category_id),product_id)
)

获取类别列表:

SELECT category_name FROM categories

这是一个全表扫描,除非你有数百个类别,否则应该没问题。

获取产品列表:

SELECT product_name FROM products

如上所述,这也是全表扫描,如果您有数千个产品和/或大型集群,则会出现问题。

要选择具有类别名称的特定产品:

SELECT product_name, category_name FROM products WHERE product_id = ?

要获取某个类别的产品列表:

SELECT category_name, product_name FROM products_by_category WHERE category_id = ?

干杯!

【讨论】:

  • 如果我更新类别表中的一个类别名称怎么办?它会影响所有表吗?
  • 如果我更新 products 表中的一个产品名称会影响按类别表的产品吗?
  • 是的,您必须使用 BATCH 语句来保持所有表同步。干杯!
猜你喜欢
  • 1970-01-01
  • 2018-11-22
  • 2019-02-27
  • 1970-01-01
  • 2018-08-09
  • 2011-01-28
  • 2010-09-17
  • 2018-07-29
  • 1970-01-01
相关资源
最近更新 更多