powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Проектирование БД
8 сообщений из 8, страница 1 из 1
Проектирование БД
    #38893660
JurikDM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день, уважаемые форумчане!
Необходимо в БД хранить данные рекордов. Для каждого типа рекорда существует отдельная таблица (например таблица Running - для рекордов по бегу, HighJump - для прыжков в высоту). Так же есть общая таблица(Records), в которой хранится общая информация о рекорде(дата, время, id пользователя и т. д.). Так вот необходимо настроить связи между таблицей Records и таблицами Running, HighJumps, например в таблице Records выбирается тип рекорда и по нему происходит связь с соответствующей таблицей.

Строго не судите, в проектировании БД я чайник)).
...
Рейтинг: 0 / 0
Проектирование БД
    #38893734
Фотография vyegorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JurikDM,

У вас таблица `records` во множественном числе, остальные в единственном. Удобнее если все одинаково, я предпочитаю
единственное число.

Код: sql
1.
2.
3.
4.
5.
6.
7.
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”, не знаю русского названия.
...
Рейтинг: 0 / 0
Проектирование БД
    #38894699
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vyegorov
Код: sql
1.
ALTER TABLE high_jump ADD CONSTRAINT c_high_jump CHECK (record_type = 'high_jump');


так ведь поле record_type находится в таблице record, а не в high_jump
...
Рейтинг: 0 / 0
Проектирование БД
    #38895011
Фотография vyegorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LeXa NalBat,

Да, я его дублирую. Да, это избыточность. Но это дает больше возможностей контролировать данные на уровне СУБД.
Всегда так делаю для подобных Моделей.

Я предпочитаю не делать FK на справочник типов, т.к. для вторичных таблиц значение всегда одно.
...
Рейтинг: 0 / 0
Проектирование БД
    #38895944
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vyegorov,

да, я тоже делал подобную функциональность, дублировал поле. но тогда надо создать foreign key по комбинации полей. чтобы гарантировать соответствие record_type в общей таблице и в частной.

Код: sql
1.
ALTER TABLE high_jump ADD FOREIGN KEY (record_id, __record_type) REFERENCES record (record_id, record_type);
...
Рейтинг: 0 / 0
Проектирование БД
    #38895981
AO_MMM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
JurikDM,

Наверное, правильнее будет создать столбец "тип рекорда" (и туда записывать id дисциплины, в которой установлен рекорд; есессно, понадобится отдельный справочник дисциплин), а не создавать на каждый чих новую таблицу Running, HighJumps, ... Facepalms ...
...
Рейтинг: 0 / 0
Проектирование БД
    #38896004
Фотография vyegorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LeXa NalBatvyegorov,

да, я тоже делал подобную функциональность, дублировал поле. но тогда надо создать foreign key по комбинации полей. чтобы гарантировать соответствие record_type в общей таблице и в частной.
Код: sql
1.
ALTER TABLE high_jump ADD FOREIGN KEY (record_id, __record_type) REFERENCES record (record_id, record_type);


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

AO_MMMJurikDM,
Наверное, правильнее будет создать столбец "тип рекорда" (и туда записывать id дисциплины, в которой установлен рекорд; есессно, понадобится отдельный справочник дисциплин), а не создавать на каждый чих новую таблицу Running, HighJumps, ... Facepalms ...
Речь идет не столько о типе записи, сколько о наборе дополнительных полей, специфичных для каждого из типов, которые будут храниться в отдельных таблицах.
...
Рейтинг: 0 / 0
Проектирование БД
    #38896028
Лопата
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vyegorov,
я как -то просматривал возможность пользовать tableoid (т.е. name::regclass::oid) в кач-ве части ключа. но это, к сож., инстансозависимо, и надо перестраивать всё при восстановлениях из бекапа. Т.е. не полетело.
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Проектирование БД
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]