cassandra 中如何处理非规范化
How is denormalization handled in cassandra
使用重复数据更新 table 的最佳方法是什么?
我有一个table
table users (
id text PRIMARY KEY,
email text,
description,
salary
)
我将对此 table 进行删除、更新、插入等操作。但我也有一个要求能够通过电子邮件和描述进行搜索。如果我使用电子邮件和描述的新复合键创建新的 table,
当我更新我的基地时table我会
insert into users (id, salary) values (1, 500);
我没有更新我的辅助 table 所需的数据,因为客户只有身份证和薪水。第二个 table 是如何更新的。
其他解决方法和缺点
- 我本可以创建实体化视图,但由于基础 table 只有一个主键,我只能再添加一列。我的搜索要求不止一栏。
- 在要搜索的列上创建二级索引。但是这样做的性能会很差,因为我要搜索的列具有很高的基数。即描述、电子邮件等
因此,"correct" 的方法是创建 3 个表。 salary_by_id、salary_by_email 和 salary_by_description。
table salary_by_id (
id text PRIMARY KEY,
salary int
)
table salary_by_email (
email text PRIMARY KEY,
salary int
)
table salary_by_description (
description text,
id int,
salary int,
primary key (description, id)
)
我将 id 添加到 salary_by_description 的原因是,根据我自己的猜测,描述不会是全局唯一的,因此它的主键中必须包含其他内容。
根据这些表的大小,最后一个可能需要在其分区键中添加一些额外的内容。如果需要,您可以将 id、电子邮件和描述添加到其他表中。
现在,当您需要插入或删除值时,请在所有 3 个表中执行此操作。如果您使用支持异步调用的驱动程序,例如 java,那么这不会花费太多额外费用。
使用重复数据更新 table 的最佳方法是什么?
我有一个table
table users (
id text PRIMARY KEY,
email text,
description,
salary
)
我将对此 table 进行删除、更新、插入等操作。但我也有一个要求能够通过电子邮件和描述进行搜索。如果我使用电子邮件和描述的新复合键创建新的 table,
当我更新我的基地时table我会
insert into users (id, salary) values (1, 500);
我没有更新我的辅助 table 所需的数据,因为客户只有身份证和薪水。第二个 table 是如何更新的。
其他解决方法和缺点
- 我本可以创建实体化视图,但由于基础 table 只有一个主键,我只能再添加一列。我的搜索要求不止一栏。
- 在要搜索的列上创建二级索引。但是这样做的性能会很差,因为我要搜索的列具有很高的基数。即描述、电子邮件等
因此,"correct" 的方法是创建 3 个表。 salary_by_id、salary_by_email 和 salary_by_description。
table salary_by_id (
id text PRIMARY KEY,
salary int
)
table salary_by_email (
email text PRIMARY KEY,
salary int
)
table salary_by_description (
description text,
id int,
salary int,
primary key (description, id)
)
我将 id 添加到 salary_by_description 的原因是,根据我自己的猜测,描述不会是全局唯一的,因此它的主键中必须包含其他内容。
根据这些表的大小,最后一个可能需要在其分区键中添加一些额外的内容。如果需要,您可以将 id、电子邮件和描述添加到其他表中。
现在,当您需要插入或删除值时,请在所有 3 个表中执行此操作。如果您使用支持异步调用的驱动程序,例如 java,那么这不会花费太多额外费用。