在Cassandra中使用轻量级事务实现唯一性

时间:2015-02-20 22:43:04

标签: transactions cassandra unique-constraint

这更像是一个数据建模问题,但它与轻量级事务有关,因为尝试使用此功能似乎会对我的数据建模方式产生影响。

我的具体用例是我想在INSERT上的特定字段强制执行唯一性。 Cassandra的文档有以下示例:

INSERT INTO customer_account (customerID, customer_email) 
VALUES (‘LauraS’, ‘lauras@gmail.com’)
IF NOT EXISTS;

在我的特定情况下,我有下表:

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也可能不同。

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

我知道非正规化是卡桑德拉的生活现实;我只想确保创建此表只是为了处理唯一性的情况。如果这种方法没有意义,请建议另一种方法。谢谢!

1 个答案:

答案 0 :(得分:3)

如果不存在具有提供密钥的行,则

INSERT ... IF NOT EXISTS会创建一个新行。它不是逐列比较,只是键。如果您要强制user_idslugmajor_versionminor_versionpatch_version的唯一性,那么这些列需要形成主键。