输入:表格数据文件:每个文件都有可变数量的列,这些列名可能对文件是唯一的和/或在其他文件之间共享(事先未知)。预计此数据不会更改,因此插入会很频繁,但更新很少。列及其关联值可以是文本的或数字的。
请求的能力:能够通过标识或范围查询以检索给定列名和值的数据行。
数据模型:在CQL
我可以使用表示文件的特定单元格值的单个表格进行建模(在这种情况下是文本的,但可以为数字数据构建类似的表格)
create table mytable(
colname text,
value text,
filename text,
rowid int,
data map<text,text>,
primary key (colname , value, filename, rowid)#partitioning on colname may not be ideal here, but will be dealt with in ways unrelated to this question
);
例如,一个文件的内容可能是:
A B C D E
i1 i2 i3 i4 i5
插入将是:
insert into mytable(colname, value, data, filename, rowid) values ('A', 'i1', {'A':'i1', 'B':'i2', 'C':'i3', 'D':'i4', 'E':'i5', 'F':'i5'}, 'F1', 1);
insert into mytable(colname, value, data, filename, rowid) values ('B', 'i2', {'A':'i1', 'B':'i2', 'C':'i3', 'D':'i4', 'E':'i5', 'F':'i5'}, 'F1', 2);
insert into mytable(colname, value, data, filename, rowid) values ('C', 'i3', {'A':'i1', 'B':'i2', 'C':'i3', 'D':'i4', 'E':'i5', 'F':'i5'}, 'F1', 3);
insert into mytable(colname, value, data, filename, rowid) values ('D', 'i4', {'A':'i1', 'B':'i2', 'C':'i3', 'D':'i4', 'E':'i5', 'F':'i5'}, 'F1', 4);
insert into mytable(colname, value, data, filename, rowid) values ('E', 'i5', {'A':'i1', 'B':'i2', 'C':'i3', 'D':'i4', 'E':'i5', 'F':'i5'}, 'F1', 5);
...
SELECT data from mytable where colname=? and value=?
问题:我们确实有数据存储限制——在这个模型中,一行的每一列值的数据值是相同的,导致大量数据重复(这是一个简单的例子,但列数可能超过 100 列——这意味着地图可以复制数百次)。
问题: Cassandra 有什么方法可以避免这种类型的数据重复,而不必创建/查询第二个表(例如通过指向数据的指针或以某种方式将映射定义为不同的)?或者,用不同的方式对具有相同查询能力和结果的数据进行建模?