【发布时间】:2015-01-26 22:06:39
【问题描述】:
与卡桑德拉,
我想用唯一的uuid 表示所有用户对象,但还包含一组零个或多个辅助用户键以映射到用户。每个辅助键应映射到一个且只有一个用户(id)。因为我需要能够快速查找辅助键来查找用户,所以我维护了一个单独的查找表,而不是辅助INDEX。
我已经对数据进行了这样的建模,但我对替代方案持开放态度:
CREATE TABLE users (
userid uuid PRIMARY KEY,
name text,
secondarykeys set<text>
);
CREATE TABLE user_secondarykeys (
secondarykey text,
userid uuid,
PRIMARY KEY(secondarykey)
);
一个典型的用例是这样的:
我得到了这个用户的辅助键mail:andreas@example.org,我想看看是否存在任何具有该辅助键的用户,如果不存在,我想创建一个新的用户对象。
我可以查找辅助键:
SELECT * FROM "user_secondarykeys" WHERE secondarykey = "mail:andreas@example.org";
如果我没有找到任何匹配项,我可以插入一个新用户:
BEGIN BATCH
INSERT INTO users (userid, name, secondarykeys) VALUES (77059e45-5fac-460b-9c4f-47528c292be0, "Andreas", {'mail:andreas@example.org'});
INSERT INTO user_secondarykeys (secondarykey, userid) VALUES ('mail:andreas@example.org', 77059e45-5fac-460b-9c4f-47528c292be0);
APPLY BATCH;
我的问题是这会导致数据不一致,因为在我的选择和插入之间,用户可以使用该辅助键插入。
我在想,如果在 user_secondarykeys 中已经存在辅助键的情况下,我可以使我的 INSERT 事务失败,那将起作用,因为它还应该将插入恢复到用户表中,因为事务的原子属性.但是,如果存在辅助键,我不知道有什么方法可以使 INSERT 失败。如果我将IF NOT EXISTS 添加到第二个插入中,它不会恢复事务,它只会避免插入user_secondarykeys,但它仍会插入users。
感谢任何有关如何以可靠方式实现此用例的建议。谢谢。
【问题讨论】:
标签: cassandra data-modeling cql cassandra-2.0