Quantcast
Channel: SQL.ru: Firebird, InterBase
Viewing all articles
Browse latest Browse all 1677

Как не одеть в один слот две шмотки ?

$
0
0
thing(thing_id, pers_id, slot_id, ...) таблица шмоток персонажа. Кому принадлежит, в какой слот одета NULL - шмотка не одета
slot_ref(slot_id, title) справочник шмоток
pers(pers_id, ...) персонажи

При одевании шмотки в слот персонажа, заполняется поле slot_id шмотки

-- Ограничение на два поля, где одно может быть NULL не работает
ALTER TABLE THING ADD CONSTRAINT UNQ1_THING UNIQUE (PERS_ID,SLOT_ID)
Problematic key value is ("PERS_ID" = 49, "SLOT_ID" = NULL).


Есть мысль (но она мне не нравится) вынести одевание шмотк в отдельную таблицу.
dressed_thing(thing_id, slot_id, pers_id) одетые шмотки это мизерная часть от общей массы. Может поле slot_id и лишнее в таблице шмоток. Выборка одетых шмоток - это очень популярный запрос. Напрягает ещё один join в запросах. (поэтому и pers_id сюда добавил, который дублирует ссылку thin.pers_id

Подскажите, пжлст, как сохранить целостность данных?

Ещё идея, но она мне кажется изратной :)
Сделать доп поле вычисляемое f(slot_id, pers_id) и на него повесить ограничение уникальности. pers_id * 100 + slot_id для снятых шмоток будет NULL, для одетых - уникальное для каждого перс/слот значение

Viewing all articles
Browse latest Browse all 1677

Trending Articles