在 Cassandra 中使用轻量级事务加强唯一性
Enforcing uniqueness using lightweight transactions in Cassandra
这更像是一个数据建模问题,但它与轻量级事务有关,因为尝试使用此功能似乎对我的数据建模方式产生了影响。
我的具体用例是我想在 INSERT
上的特定字段上强制执行唯一性。 Cassandra 的文档有以下示例:
INSERT INTO customer_account (customerID, customer_email)
VALUES (‘LauraS’, ‘lauras@gmail.com’)
IF NOT EXISTS;
在我的特殊情况下,我有以下 table:
CREATE TABLE IF NOT EXISTS plugins (
id uuid PRIMARY KEY,
user_id uuid,
name text,
slug text,
major_version int,
minor_version int,
patch_version int
);
我要强制执行的约束是 user_id
、slug
、major_version
、minor_version
和 patch_version
的组合必须是唯一的.我不能简单地做:
INSERT INTO
plugins (
user_id,
slug,
major_version,
minor_version,
patch_version
) VALUES (...) IF NOT EXISTS;
这是因为我需要name
和id
。但是,包括 name
和 id
仍然会导致写入内容,因为 IF NOT EXISTS
会失败,因为 id
会有所不同(至少) 和 name
也可能不同。
这是否意味着我需要维护一个单独的 table,它只有 user_id
、slug
、major_version
、minor_version
和 patch_version
?然后我会尝试写入此 table,并查看操作结果。如果写入成功,我将继续填充所有其他关联的 tables.
我知道非规范化是 Cassandra 生活中的一个事实;我只是想确保在这里创建这个 table 只是为了处理唯一性的情况是有意义的。如果这种方法没有意义,请建议另一种方法。谢谢!
INSERT ... IF NOT EXISTS
如果不存在具有提供键的行,则创建一个新行。它不逐列比较,只比较键。如果你想强制 user_id
、slug
、major_version
、minor_version
和 patch_version
的唯一性,那么这些列需要形成一个主键。
这更像是一个数据建模问题,但它与轻量级事务有关,因为尝试使用此功能似乎对我的数据建模方式产生了影响。
我的具体用例是我想在 INSERT
上的特定字段上强制执行唯一性。 Cassandra 的文档有以下示例:
INSERT INTO customer_account (customerID, customer_email)
VALUES (‘LauraS’, ‘lauras@gmail.com’)
IF NOT EXISTS;
在我的特殊情况下,我有以下 table:
CREATE TABLE IF NOT EXISTS plugins (
id uuid PRIMARY KEY,
user_id uuid,
name text,
slug text,
major_version int,
minor_version int,
patch_version int
);
我要强制执行的约束是 user_id
、slug
、major_version
、minor_version
和 patch_version
的组合必须是唯一的.我不能简单地做:
INSERT INTO
plugins (
user_id,
slug,
major_version,
minor_version,
patch_version
) VALUES (...) IF NOT EXISTS;
这是因为我需要name
和id
。但是,包括 name
和 id
仍然会导致写入内容,因为 IF NOT EXISTS
会失败,因为 id
会有所不同(至少) 和 name
也可能不同。
这是否意味着我需要维护一个单独的 table,它只有 user_id
、slug
、major_version
、minor_version
和 patch_version
?然后我会尝试写入此 table,并查看操作结果。如果写入成功,我将继续填充所有其他关联的 tables.
我知道非规范化是 Cassandra 生活中的一个事实;我只是想确保在这里创建这个 table 只是为了处理唯一性的情况是有意义的。如果这种方法没有意义,请建议另一种方法。谢谢!
INSERT ... IF NOT EXISTS
如果不存在具有提供键的行,则创建一个新行。它不逐列比较,只比较键。如果你想强制 user_id
、slug
、major_version
、minor_version
和 patch_version
的唯一性,那么这些列需要形成一个主键。