Мне действительно было трудно узнать, какие слова вставить в заголовок моего вопроса, так как я не особенно уверен, есть ли шаблон базы данных, связанный с моей проблемой. Я постараюсь максимально упростить вопросы, чтобы разобраться в сути проблемы.
Предположим, у меня есть несколько таблиц.
Первый - это список типов виджетов:
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 ограничение может быть обработано только с помощью триггера?
Я спрашиваю только потому, что хотел бы пойти по маршруту ограничения, если это вообще возможно.
Большое спасибо за вашу помощь,
Пол