Cassandra 中的 UUID 真的“有必要”吗?

clo*_*ker 2 cassandra

我最近开始使用 Cassandra - 我来自传统的关系数据库背景,所以它肯定有点不同。我习惯做的一件事是为每一行(OID 等)生成一个唯一的 ID。因此,对于我在 Cassandra 中创建的表,我一直在每个表上放置一个 UUID 列并生成一个 UUID。我的问题是……这真的是“必要的”吗?我没有使用 UUID 作为我的分区键的一部分,所以我现在并没有真正将它用于任何事情,但这是一个很难打破的习惯。一些建议会很棒!

Gui*_*e S 6

完全没有必要。但是在某些情况下,在表中引入 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)