Налагане на уникалност с помощта на леки транзакции в Cassandra

Това е по-скоро въпрос за моделиране на данни, но е свързан с леки транзакции, защото изглежда, че опитът да се използва тази функция оказва влияние върху начина, по който моделирам данните си.

Моят специфичен случай на употреба е, че искам да наложа уникалност на конкретни полета на INSERT. Документацията на Cassandra има следния пример:

INSERT INTO customer_account (customerID, customer_email) 
VALUES (‘LauraS’, ‘[email protected]’)
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_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 също може да е различно.

Това означава ли, че трябва да поддържам отделна таблица, която има само user_id, slug, major_version, minor_version и patch_version? След това бих се опитал да пиша в тази таблица и да погледна резултата от операцията. Ако записът успее, ще продължа и ще попълня всички други свързани таблици.

Знам, че денормализирането е факт от живота с Касандра; Просто искам да се уверя, че тук има смисъл да създам тази таблица само за да се справя със случая на уникалност. Ако този подход няма смисъл, моля, предложете друг. Благодаря!


person Vivin Paliath    schedule 20.02.2015    source източник


Отговори (1)


INSERT ... IF NOT EXISTS създава нов ред, ако не съществува ред с предоставен ключ. Не сравнява колона по колона, а само ключа. Ако искате да наложите уникалността на user_id, slug, major_version, minor_version и patch_version, тогава тези колони трябва да образуват първичен ключ.

person Roman Tumaykin    schedule 21.02.2015
comment
Виждам. Това означава ли, че ще имам нужда от отделна таблица, която поддържа тези полета като първичен ключ? Моята оригинална таблица има id има първичен ключ, защото често правя търсения по id. - person Vivin Paliath; 21.02.2015
comment
Готино! Това търсех. Просто исках да знам дали има смисъл да направя друга таблица само за да наложа това ограничение. - person Vivin Paliath; 22.02.2015
comment
Ако се замислите, всички индекси и уникални ограничения в традиционните релационни бази данни имат почти същата структура като таблиците, държат се почти като таблици. Те просто се използват вътрешно - person Roman Tumaykin; 22.02.2015