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