JurikDM
Дата: 03.03.2015 15:25:20
Добрый день, уважаемые форумчане!
Необходимо в БД хранить данные рекордов. Для каждого типа рекорда существует отдельная таблица (например таблица Running - для рекордов по бегу, HighJump - для прыжков в высоту). Так же есть общая таблица(Records), в которой хранится общая информация о рекорде(дата, время, id пользователя и т. д.). Так вот необходимо настроить связи между таблицей Records и таблицами Running, HighJumps, например в таблице Records выбирается тип рекорда и по нему происходит связь с соответствующей таблицей.
Строго не судите, в проектировании БД я чайник)).
vyegorov
Дата: 03.03.2015 16:07:04
JurikDM,
У вас таблица `records` во множественном числе, остальные в единственном. Удобнее если все одинаково, я предпочитаю
единственное число.
ALTER TABLE record ADD CONSTRAINT p_record PRIMARY KEY (record_id);
ALTER TABLE high_jump ADD CONSTRAINT p_high_jump PRIMARY KEY (record_id);
ALTER TABLE high_jump ADD CONSTRAINT f_high_jump FOREIGN KEY (record_id) REFERENCES record;
ALTER TABLE high_jump ADD CONSTRAINT c_high_jump CHECK (record_type = 'high_jump');
-- дальше по аналогии
По-английски это называется “exclusive subtype tables”, не знаю русского названия.
LeXa NalBat
Дата: 04.03.2015 15:03:06
vyegorov |
---|
ALTER TABLE high_jump ADD CONSTRAINT c_high_jump CHECK (record_type = 'high_jump');
|
так ведь поле record_type находится в таблице record, а не в high_jump
vyegorov
Дата: 04.03.2015 18:38:02
LeXa NalBat,
Да, я его дублирую. Да, это избыточность. Но это дает больше возможностей контролировать данные на уровне СУБД.
Всегда так делаю для подобных Моделей.
Я предпочитаю не делать FK на справочник типов, т.к. для вторичных таблиц значение всегда одно.
LeXa NalBat
Дата: 05.03.2015 13:50:43
vyegorov,
да, я тоже делал подобную функциональность, дублировал поле. но тогда надо создать foreign key по комбинации полей. чтобы гарантировать соответствие record_type в общей таблице и в частной.
ALTER TABLE high_jump ADD FOREIGN KEY (record_id, __record_type) REFERENCES record (record_id, record_type);
AO_MMM
Дата: 05.03.2015 14:12:20
JurikDM,
Наверное, правильнее будет создать столбец "тип рекорда" (и туда записывать id дисциплины, в которой установлен рекорд; есессно, понадобится отдельный справочник дисциплин), а не создавать на каждый чих новую таблицу Running, HighJumps, ... Facepalms ...
vyegorov
Дата: 05.03.2015 14:21:49
LeXa NalBat |
---|
vyegorov,
да, я тоже делал подобную функциональность, дублировал поле. но тогда надо создать foreign key по комбинации полей. чтобы гарантировать соответствие record_type в общей таблице и в частной.
ALTER TABLE high_jump ADD FOREIGN KEY (record_id, __record_type) REFERENCES record (record_id, record_type);
|
Да, вы правы. Без такого FK получается, что один родитель может иметь несколько наследованных записей в разных таблицах.
AO_MMM |
---|
JurikDM, Наверное, правильнее будет создать столбец "тип рекорда" (и туда записывать id дисциплины, в которой установлен рекорд; есессно, понадобится отдельный справочник дисциплин), а не создавать на каждый чих новую таблицу Running, HighJumps, ... Facepalms ... |
Речь идет не столько о типе записи, сколько о наборе дополнительных полей, специфичных для каждого из типов, которые будут храниться в отдельных таблицах.
лопата
Дата: 05.03.2015 14:30:19
vyegorov,
я как -то просматривал возможность пользовать tableoid (т.е. name::regclass::oid) в кач-ве части ключа. но это, к сож., инстансозависимо, и надо перестраивать всё при восстановлениях из бекапа. Т.е. не полетело.