我正在为一家水疗诊所设计一个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
的单个字段,则允许单个字段读取/写入。