具有多个 Key-Value 的 CassandraDB 表

Posted

技术标签:

【中文标题】具有多个 Key-Value 的 CassandraDB 表【英文标题】:CassandraDB table with multiple Key-Value 【发布时间】:2022-01-03 16:38:22 【问题描述】:

我是 CassandraDB 的新用户。我正在尝试创建一个包含 3 个静态列的表,例如“name”、“city”和“age”,然后我在考虑两个“key”和“value”列,因为我的表可以收到很多的输入。我该如何定义这个表?我正在尝试实现可扩展的目标,即:

表格列 --> “名称”、“城市”、“年龄”、“键”、“值”

姓名:马克

城市:利物浦

年龄:26

钥匙:汽车

价值:奥迪 A3

关键:工作

价值:计算机工程师

重点:主要爱好

价值:足球

我正在寻找表格定义。。有什么帮助吗?非常感谢您。

【问题讨论】:

请具体说明您的问题,写下完整的用例,这样很容易回答。 您好,感谢您的回答。我正在尝试创建表定义。 “如果不存在则创建表(ts 时间戳,名称文本,年龄文本......)” 那件事。我怎样才能实现那个“可扩展”的键值表? 【参考方案1】:

如果我理解正确,您想创建一个按“姓名”、“城市”和“年龄”分组的键值对存储。这种方法的解决方案很少 -

首先使用 STATIC 列 -

create table record_by_id(
recordId text,
name text static,
city text static,
age int static,
key text,
value text
primary key (recordId, key)
);

对于相同的记录 ID,此表设计、名称、城市、年龄保持不变。您可以为同一记录 ID 使用任意数量的键值。

第二种方法是-

create table record_by_id(
name text ,
city text ,
age int ,
key text,
value text
primary key ((name,city,age),key)
);

在这个设计中,名称、城市和年龄是分区键的一部分。键列是聚类键的一部分。

这两种方法都是可扩展的,但第一种方法有利于维护。

【讨论】:

不错!看起来我们有一些类似的想法。伟大的思想都一样! 非常感谢您的回答,非常有帮助!我还将添加一个时间戳 (ts) 和一个“id”。【参考方案2】:

具有 3 个静态列的表

所以“静态”我假设您不是指 Cassandra 对 static columns 的定义。这很酷,我知道你的意思。但提到确实让我知道如何处理这个问题:

正在尝试创建表定义

我看到了两种解决方法。

CREATE TABLE user_properties (
    name TEXT,
    city TEXT STATIC,
    age INT STATIC,
    key TEXT,
    value TEXT,
    PRIMARY KEY (name,key));

因为我们有静态列(仅使用分区键 name 存储)添加更多键/值只是将更多 keys 添加到同一 name 的问题,因此插入数据如下所示:

INSERT INTO user_properties (name,city,age,key,value)
    VALUES ('Mark','Liverpool',26,'Car','Audi A3');
INSERT INTO user_properties (name,key,value)
    VALUES ('Mark','Job','Computer Engineer');
INSERT INTO user_properties (name,key,value)
    VALUES ('Mark','Main hobby','Football');

查询如下:

> SELECT * FROm user_properties WHERE name='Mark';

 name | key        | age | city      | value
------+------------+-----+-----------+-------------------
 Mark |        Car |  26 | Liverpool |           Audi A3
 Mark |        Job |  26 | Liverpool | Computer Engineer
 Mark | Main hobby |  26 | Liverpool |          Football

(3 rows)

这是实现它的“简单”方法。

或者

CREATE TABLE user_properties_map (
    name TEXT,
    city TEXT,
    age INT,
    kv MAP<TEXT,TEXT>,
    PRIMARY KEY (name));

使用单个分区键作为 PRIMARY KEY,我们可以一次性插入所有内容:

INSERT INTO user_properties_map (name,city,age,kv)
    VALUES ('Mark','Liverpool',26,'Car':'Audi A3',
                                   'Job':'Computer Engineer',
                                   'Main hobby':'Football');

查询看起来像这样:

> SELECT * FROm user_properties_map  WHERE name='Mark';

 name | age | city      | kv
------+-----+-----------+--------------------------------------------------------------------------
 Mark |  26 | Liverpool | 'Car': 'Audi A3', 'Job': 'Computer Engineer', 'Main hobby': 'Football'

(1 rows)

这具有将属性放入地图的额外好处,如果这是您打算在应用程序端使用它的方式,这可能会有所帮助。缺点是 Cassandra 集合最好保持在 100 个以下,写入稍微复杂一些,并且您无法查询映射的单个条目。

但是通过键入名称(可能还希望包括姓氏或其他有助于唯一性的内容),数据应该可以很好地扩展。除非您计划处理数千个键/值对,否则分区增长不会成为问题。

基本上,根据 Cassandra 的标准建议选择结构,考虑如何查询数据,然后构建适合它的表。

【讨论】:

嗨亚伦。非常感谢您帮助我解决这个问题。我肯定会使用第一种方法,因为它更接近我的目的。 :D

以上是关于具有多个 Key-Value 的 CassandraDB 表的主要内容,如果未能解决你的问题,请参考以下文章

(不够详细)etcd:key-value式存储系统

禁用 Spring Boot 启动器 Cassandra 进行单元测试

Map接口特点

map的运用

细谈hashmap

java properties读取第一对key-value