具有多个 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
存储)添加更多键/值只是将更多 key
s 添加到同一 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 表的主要内容,如果未能解决你的问题,请参考以下文章