Cassandra的UUID真的“必要吗?”

时间:2016-10-26 00:02:12

标签: cassandra

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

1 个答案:

答案 0 :(得分:4)

确切地说没有必要。但在某些情况下,在表中引入UUID可能很有用。 例如,假设你有一个像这样的表:

CREATE TABLE user (
    id uuid,
    name text,
    login text,
    day_of_birth date
) PRIMARY KEY (login);

此表允许您通过登录查询用户。 现在假设您还想按名称查询用户。 当然,如果这种查询只运行一次,您可以创建一个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);

但是使用这种结构,您必须在所有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);