我有很多文档(5000万),每个文档的子部分可能是0到50。 每个部分都有元数据。 我可以使用动态列族来存储元数据吗?
这里我想存储E3的每个部分的大小,名称,计数等元数据,即E2,E1,E0。 但我需要一次检索具有相同ID的所有(E3,E2,E1,))。 有些文档可能类似于E50,E49,其中包含50个子部分。
Casandra列表的列
E_0_COL_ID
E_0_COL_Name
E_0_COL_Size
...
..
E_1_COL_ID
E_1_COL_Nmae
E_1_COL_Size..
..
..
E_n_COL_NAME
E_n_COL_SIZE
这是Cassandra动态列的正确用例吗?
CQL SCHEMA
首先创建表
CREATE TABLE DOCUMENT_TABLE(
E_0_COL_ID bigint,
E_0_COL_Name text,
E_0_COL_Size bigint
PRIMARY KEY (E_0_COL_ID )
)
Add dynamic columns as per number of parts
ALTER TABLE test.DOCUMENT_TABLE ADD E_1_COL_ID bigint;
ALTER TABLE test.DOCUMENT_TABLE ADD E_1_COL_Name text;
ALTER TABLE test.DOCUMENT_TABLE ADD E_1_COL_Size bigint;
ALTER TABLE test.DOCUMENT_TABLE ADD E_2_COL_ID bigint;
ALTER TABLE test.DOCUMENT_TABLE ADD E_2_COL_Name text;
ALTER TABLE test.DOCUMENT_TABLE ADD E_2_COL_Size bigint;
...
ALTER TABLE test.DOCUMENT_TABLE ADD E_n_COL_ID bigint;
ALTER TABLE test.DOCUMENT_TABLE ADD E_n_COL_Name text;
ALTER TABLE test.DOCUMENT_TABLE ADD E_n_COL_Size bigint
CASSANDRA中动态栏目家庭的正确用途是什么?
答案 0 :(得分:0)
该方法的缺点是您要为表中的所有文档添加这些列,即使它们没有特定的子部分。如此多的行将这些未使用的列返回为null,这可能是您应用程序中处理的烦恼,更不用说拥有如此多的硬编码列名。
使用固定架构可能更灵活,更容易,而不是像这样动态添加列。您可以将子部件存储为聚类列,主文档ID作为分区键,子部件ID作为聚类列,如下所示:
CREATE TABLE docs (
id bigint,
sub_id bigint,
sub_name text,
sub_size bigint,
PRIMARY KEY (id, sub_id)
);
// insert main document with sub_id set to -1 to indicate it is the main document name
INSERT INTO docs ( id, sub_id, sub_name, sub_size) VALUES (123, -1, "Main doc name", 456);
// insert a sub part to the main document
INSERT_INTO docs ( id, sub_id, sub_name, sub_size) VALUES (123, 1, "Sub part 1 name", 789);
获取文档及其所有部分:
SELECT * FROM docs WHERE id=123;
这将返回主文档名称作为第一行(因为聚簇数据按升序sub_id排序),其余行将是子部分。这还允许您对sub_id执行范围查询,例如:
SELECT * FROM docs WHERE id=123 and sub_id > 20 and sub_id < 50;
另一种可能性是使用其中一种集合类型,例如列表类型。您可以为sub_id,sub_name,sub_size元组创建用户定义的类型,然后在主表中有一个子部分列表:
CREATE TYPE sub_doc (
id bigint,
name text,
size bigint,
)
CREATE TABLE docs (
id bigint,
name text,
size bigint,
subdocs list<sub_doc>,
PRIMARY KEY (id)
);
选择哪个取决于您在应用程序中所期望的访问和修改模式。如果由于某种原因你想要在一行中返回所有子文档,那么列表会很好。集群方法可以更轻松地动态添加和删除行,并且可以更轻松地将子部分作为单个行进行访问。