在 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_idslugmajor_versionminor_versionpatch_version 的组合必须是唯一的.我不能简单地做:

INSERT INTO 
    plugins (
        user_id, 
        slug, 
        major_version, 
        minor_version, 
        patch_version
    ) VALUES (...) IF NOT EXISTS;

这是因为我需要nameid。但是,包括 nameid 仍然会导致写入内容,因为 IF NOT EXISTS 会失败,因为 id 会有所不同(至少) 和 name 也可能不同。

这是否意味着我需要维护一个单独的 table,它只有 user_idslugmajor_versionminor_versionpatch_version?然后我会尝试写入此 table,并查看操作结果。如果写入成功,我将继续填充所有其他关联的 tables.

我知道非规范化是 Cassandra 生活中的一个事实;我只是想确保在这里创建这个 table 只是为了处理唯一性的情况是有意义的。如果这种方法没有意义,请建议另一种方法。谢谢!

INSERT ... IF NOT EXISTS 如果不存在具有提供键的行,则创建一个新行。它不逐列比较,只比较键。如果你想强制 user_idslugmajor_versionminor_versionpatch_version 的唯一性,那么这些列需要形成一个主键。