我最近开始使用 Cassandra - 我来自传统的关系数据库背景,所以它肯定有点不同。我习惯做的一件事是为每一行(OID 等)生成一个唯一的 ID。因此,对于我在 Cassandra 中创建的表,我一直在每个表上放置一个 UUID 列并生成一个 UUID。我的问题是……这真的是“必要的”吗?我没有使用 UUID 作为我的分区键的一部分,所以我现在并没有真正将它用于任何事情,但这是一个很难打破的习惯。一些建议会很棒!
完全没有必要。但是在某些情况下,在表中引入 UUID 可能很有用。例如,假设你有一个像这样的表:
CREATE TABLE user (
id uuid,
name text,
login text,
day_of_birth date
) PRIMARY KEY (login);
Run Code Online (Sandbox Code Playgroud)
此表允许您通过登录查询用户。现在假设您还想按名称查询用户。当然,如果这种查询只运行几次,您可以创建一个SECONDARY INDEX
. 但是,如果您想获得良好的读取性能,可以通过使用如下表结构来对数据进行非规范化:
CREATE TABLE user (
id uuid,
name text,
login text,
day_of_birth date
) PRIMARY KEY (id);
CREATE TABLE user_by_name (
id uuid,
name text
) PRIMARY KEY (name);
CREATE TABLE user_by_login (
id uuid,
login text
) PRIMARY KEY (login);
Run Code Online (Sandbox Code Playgroud)
但是使用这种结构,您必须在所有 3 个表中插入和更新以维护数据。而不是创建其他两个表,您可以使用MATERIALIZED VIEW
仅维护一个表,让 cassandra 维护视图:
CREATE TABLE user (
id uuid,
name text,
login text,
day_of_birth date
) PRIMARY KEY (id);
CREATE MATERIALIZED VIEW user_by_name
AS
SELECT *
FROM user
WHERE id IS NOT NULL
AND name IS NOT NULL
PRIMARY KEY ((name), id);
CREATE MATERIALIZED VIEW user_by_login
AS
SELECT *
FROM user
WHERE id IS NOT NULL
AND login IS NOT NULL
PRIMARY KEY ((login), id);
Run Code Online (Sandbox Code Playgroud)