Cassandra 列名抽象,22 或 220 列名.后果是什么?



我正在为一家水疗诊所设计一个Cassandra数据库,该数据库需要从多达300种类型的唯一列值中收集每次客户访问的数据子集。 我正在尝试权衡 2 个 Cassandra 数据模型之间的潜在权衡。 第一个模型具有 200 多个唯一的列名称,每个客户端数据点一个。

第二个模型使用 22 个多态列,这些列根据row_format值采用不同的值。每个row_format值都有一组唯一的列标签,用于仪表板和报表中以区分数据点。

对于这两种模型,由row_format和时间戳聚类列定义的每行通常只有 3 到 10 个单元格。数据库将创建一个永久的客户端遭遇记录,因此它们不会被删除或更新。

我已经设置了几个带有列名标签的 UX 仪表板,这些仪表板使用多态抽象column_name模型正确区分不同的客户端数据值。 这在小规模上运作良好。

//Abbreviated table with 200 to 300 column names w/ row_format prefixes
CREATE TABLE encounter_records
(
client_id  text,
row_format  tinyint,
ts  timestamp,
address_city  text,
address_state  text,
address_street  text,
address_zip text,
name_first  text,
name_last  text,
name_middle  text,
name_mothers_maiden  text,
numbers_mobile_phone  text,
numbers_home_phone  text,
numbers_socal security  text,
pain1_bodysite  text. 
pain1_description  text,
pain1_severity  tinyint,
pain1_initial_report_date  date,
pain1_initial_severity  text,
restriction_description  text,
restriction_severity  tinyint,
restriction_initial_report_date  date,
restriction_initial_severity  text,
. . . . 
ETC,
"200 more column names"
)
PRIMARY KEY ((client_id), row_format, ts)
WITH CLUSTERING ORDER BY (ts DESC);

//Table with 22 polymorphic abstracted column names
CREATE TABLE records_historical 
(
Client_id  text,
row_format  tinyint,
ts  timestamp,
date1 date
lists1  list,
lists2  list,
maps1 map,
maps2 map,
note1  text,
note2  text,
note3  text,
note4  text,
note5  text,
note6  text,
number1  tinyint, 
number2  varint, 
number3  varint, 
number4  varint, 
number5  varint, 
number6  varint,
set1  set
set2  set
)
PRIMARY KEY ((client_id), row_format, ts)
WITH CLUSTERING ORDER BY (ts DESC);

我担心当数据库被放大或当我为查询搜索或其他工具引入 Spark 时可能会有什么后果。 使用列名抽象与使用数百个列名相比有什么缺点?

另一种选择,特别是如果这些字段随时间变化,最好添加"键"聚类分析键和 blob 值,如下所示:

CREATE TABLE encounter_records (
client_id  text,
row_format  tinyint,
ts  timestamp,
key text,
value blob,
PRIMARY KEY ((client_id), row_format, ts, key)

这也允许客户端在中行翻页结果(设置提取大小(,这可以更有效地进行GC明智。如果您要拉整行并且其中有 200 个单元格,则驱动程序必须一次拉动所有行,这可能相当大。

这在很大程度上取决于您打算如何阅读或编写它。如果您总是更新所有内容,并且始终读取将整个集合存储在 blob(即协议缓冲区(或 json 字符串中的所有内容。如果您要更新具有key的单个字段,则允许单个字段读取/写入。

最新更新