Нужно ли мне писать триггер для такого простого ограничения? - PullRequest
0 голосов
/ 06 января 2011

Мне действительно было трудно узнать, какие слова вставить в заголовок моего вопроса, так как я не особенно уверен, есть ли шаблон базы данных, связанный с моей проблемой. Я постараюсь максимально упростить вопросы, чтобы разобраться в сути проблемы.

Предположим, у меня есть несколько таблиц. Первый - это список типов виджетов:

create table widget_types (
    widget_type_id number(7,0) primary key,
    description varchar2(50)
);

Следующая содержит значки:

create table icons (
    icon_id number(7,0) primary key,
    picture blob
);

Несмотря на то, что пользователи могут выбирать предпочитаемый виджет, существует предопределенное подмножество виджетов, из которых они могут выбирать для каждого типа виджетов.

create table icon_associations (
    widget_type_id number(7,0) references widget_types,
    icon_id number(7,0) references icons,
    primary key (widget_type_id, icon_id)
);

create table icon_prefs (
    user_id number(7,0) references users,
    widget_type_id number(7,0),
    icon_id number(7,0),
    primary key (user_id, widget_type_id),
    foreign key (widget_type_id, icon_id) references icon_associations
);

Пока все довольно просто.

Давайте теперь предположим, что если мы отображаем значок для пользователя, который не настроил свои предпочтения, мы выбираем одно из соответствующих изображений, связанных с текущим виджетом. Я хотел бы указать предпочтительный значок для отображения в таком случае, и вот где я столкнулся с моей проблемой:

alter table icon_associations 
    add ( is_preferred char(1) check( is_preferred in ('y','n') ) )
;

Я не вижу, как можно обеспечить, чтобы для каждого типа виджета была одна и только одна строка, для которой is_preferred установлено в 'y'.

Я знаю, что в MySQL я могу написать подзапрос в моем проверочном ограничении, чтобы быстро решить эту проблему. Это невозможно в Oracle.

Является ли моя ошибка в том, что этот столбец не имеет бизнес-позиции в таблице icon_associations? Если нет, куда это должно идти? Это тот случай, когда в Oracle ограничение может быть обработано только с помощью триггера?

Я спрашиваю только потому, что хотел бы пойти по маршруту ограничения, если это вообще возможно.

Большое спасибо за вашу помощь, Пол

Ответы [ 2 ]

0 голосов
/ 06 января 2011

Если значки по умолчанию не меняются, можете ли вы просто убедиться, что значок по умолчанию помещается в таблицу icon_associations первым?

Таким образом, вам всегда гарантирован ОДИН и ТОЛЬКО один значок по умолчанию, он будетникогда не уходите, пока есть значки ARE, и вам не нужно возиться со столбцом is_preferred или его ограничениями и триггерами.

Также было бы легко получить значок по умолчанию:

SELECT * from icon_associations WHERE ID=MIN(ID)

Недостатком является то, что изменение значка по умолчанию потребует немного работы, но если этого никогда не произойдет, это решитваш столбец is_preferred.

0 голосов
/ 06 января 2011

Один простой способ, который, я считаю, решает вашу проблему, состоит в том, чтобы иметь другую таблицу с именем

icon_default_associations (widget_type_id, icon_id)

и просто заставить (widget_type_id, icon_id) подчиняться УНИКАЛЬНОМУ ограничению (или сделать его первичным ключом).

Я думаю, что вы перегружаете цель icon_associations, если вы делаете это так, как пытаетесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...