加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

nosql – Cassandra和数据模型优化中的一对多等价物

发布时间:2020-12-13 13:28:15 所属栏目:百科 来源:网络整理
导读:我在Cassandra中建模我的数据库,来自RDBMS.我想知道如何创建一对多关系,该关系嵌入在相同的列名中并为我的表建模以满足以下查询需求. 例如: Boxes:{ 23442:{ belongs_to_user: user1,box_title: 'the box title',items:{ 1: { name: 'itemname1',size: 44 }
我在Cassandra中建模我的数据库,来自RDBMS.我想知道如何创建一对多关系,该关系嵌入在相同的列名中并为我的表建模以满足以下查询需求.

例如:

Boxes:{
  23442:{
    belongs_to_user: user1,box_title: 'the box title',items:{
      1: {
         name: 'itemname1',size: 44
      },2: {
        name: 'itemname2',size: 24
      }
    }
  },{ ... }
}

我读到它最好使用复合列而不是超级列,所以我需要一个实现它的最佳方法的例子.我的疑问如下:

>按ID获取框的项目
>使用他们的物品获得前20个盒子(用于在页面上显示包含其物品的一系列盒子)
>按项目ID更新项目大小(按数字增加大小)
>通过userid获取所有框(所有属于特定用户的框)

我期待大量的写入来改变盒子中每个项目的大小.我想知道实现它的最佳方法,而无需使用超级列.此外,我不介意考虑将Cassandra 1.2新功能考虑在内的解决方案,因为我将在生产中使用它.

谢谢

解决方法

出于多种原因,这种特殊模型具有一定的挑战性.

例如,使用框ID作为行键,查询一系列框将需要Cassandra中的范围查询(而不是列切片),这意味着使用有序分区程序.有序的分区程序几乎总是一个坏主意.

另一个挑战来自需要增加项目大小,因为这需要使用计数器列族.计数器列族仅存储计数器值.

暂时不需要一系列的盒子ID,您可以使用CQL3中的多个表对此进行建模,如下所示:

CREATE TABLE boxes (                                                                       
   id int PRIMARY KEY,belongs_to_user text,box_title text,);
CREATE INDEX useridx on boxes (belongs_to_user);

CREATE TABLE box_items (                                                                   
   id int,item int,size counter,PRIMARY KEY(id,item)                                                               
);

CREATE TABLE box_item_names (
    id int PRIMARY KEY,name text
);

BEGIN BATCH
  INSERT INTO boxes (id,belongs_to_user,box_title) VALUES (23442,'user1','the box title');
  INSERT INTO box_items (id,item,name) VALUES (23442,1,'itemname1');
  INSERT INTO box_items (id,'itemname2');
  UPDATE box_items SET size = size + 44 WHERE id = 23442 AND item = 1;                       
  UPDATE box_items SET size = size + 24 WHERE id = 23442 AND item = 2;
APPLY BATCH

-- Get items for box by ID                                                               
SELECT size FROM box_items WHERE id = 23442 AND item = 1;

-- Boxes by user ID
SELECT * FROM boxes WHERE belongs_to_user = 'user1';

值得注意的是,上面的BATCH突变既是原子的,也是孤立的.

从技术上讲,您还可以将所有这些都归一化为单个表.例如:

CREATE TABLE boxes (
   id int,name text,box_title,name)
);

UPDATE boxes set size = item_size + 44 WHERE id = 23442 AND belongs_to_user = 'user1'
    AND box_title = 'the box title' AND name = 'itemname1' AND item = 1;

SELECT item,name,size FROM boxes WHERE id = 23442;

但是,这并不能保证正确性.例如,此模型使同一个框的项目可以具有不同的用户或标题.而且,由于这会使盒子成为一个反列列,因此它限制了您将来如何改进模式.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读