powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Связь по внешнему ключу к нескольким таблицам
6 сообщений из 6, страница 1 из 1
Связь по внешнему ключу к нескольким таблицам
    #39115985
G00dWINe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Друзья, всем доброго времени суток!

Возник вопрос, который не дает мне покоя.

Имеются объекты, каждый объект относится к какому-либо типу объектов.
Каждый объект нужно описывать, но в зависимости от типа объекта, т.е. набор информации для каждого типа объекта уникален. Например, для типа "компьютеры" описываются ОС, IP, MAC, а для типа "телефоны" описываются ОС, IP, провайдер (все это условно говоря).

Соответственно есть следующие таблицы:
1. Объекты
2. Типы
3. Таблица для описания типа "компьютеры"
4. Таблица для описания типа "телефоны"
5. Таблица которую я зачем-то сам еще добавил, в которой связывается id типа с id какой-либо из таблиц для описания (на скриншоте будет видно).

Вопросы:
1. Взлетит или не взлетит? Если нет, то как можно сделать?
2. Может ли быть из одной таблицы несколько ссылок на другие таблицы?

PS: да, можно разделять все программно: "если тип такой, то делаем запрос из таблицы для этого типа, если тип другой, то запрос из таблицы другого типа", но можно ли сделать все проще на уровне БД?

PSS: на скриншоте таблица с объектами отсутствует

Заранее спасибо, если спрашиваю чушь, то извините :)
...
Рейтинг: 0 / 0
Связь по внешнему ключу к нескольким таблицам
    #39116127
Кот Матроскин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
G00dWINeВопросы:
1. Взлетит или не взлетит? Если нет, то как можно сделать?
2. Может ли быть из одной таблицы несколько ссылок на другие таблицы?

1. Вполне может взлететь, стандартный паттерн "наследование в РМД". Из неудобств - когда у Вас помимо компьютеров и телефонов появятся планшеты, придется заводить еще одну таблицу и менять код. Зато структура прозрачная и работает б.м. быстро.
2. Да, может.
...
Рейтинг: 0 / 0
Связь по внешнему ключу к нескольким таблицам
    #39116181
G00dWINe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Кот Матроскин, как бы Вы решили данную задачу? (предполагается, что типы будут добавляться). И какой из вариантов будет работать быстрее?
...
Рейтинг: 0 / 0
Связь по внешнему ключу к нескольким таблицам
    #39116544
SERG1257
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
G00dWINe Кот Матроскин, как бы Вы решили данную задачу? (предполагается, что типы будут добавляться). И какой из вариантов будет работать быстрее? Отвечу за Матроскина по-еврейски.
Куда водителю лучше поворачивать направо или налево? Правый поворот будет полегче, значит ли что надо поворачивать всегда направо? А прямо ехать еще легче и быстрее, так может и не надо поворачивать вообще?
То есть - для принятия решения информации недостаточно .

Что именно будет быстрее - поиск, добавление поддержки нового типа?

Я бы посоветовал поискать на этом форуме по слову "наследование", найти реализацию с одной, двумя и тремя таблицами, почитать о достоинствах/недостатках, спроецировать на вашу ситуацию и принять решение.
...
Рейтинг: 0 / 0
Связь по внешнему ключу к нескольким таблицам
    #39139616
Гуляев Гоша
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как я делал подобные вещи:
Код: sql
1.
2.
3.
4.
table objectTypes (
   id     SERIAL PRIMARY KEY,
   typeName CHAR(100)
)


Код: sql
1.
2.
3.
4.
5.
6.
table objType_properties (
   id     SERIAL PRIMARY KEY,
   typeID SERIAL,
   propName CHAR(100),
   FOREIGN KEY typeID REFERENCES objectTypes(id)
)


Код: sql
1.
2.
3.
4.
5.
6.
table objects (
   id     SERIAL PRIMARY KEY,
   typeID SERIAL,
   objName CHAR(100),
   FOREIGN KEY typeID REFERENCES objectTypes(id)
)


Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
table objectProperties (
   id    SERIAL PRIMARY KEY,
   objectID SERIAL,
   propID    SERIAL,
   propData CHAR(100),
   UNIQUE KEY (objectID, propID),
   FOREIGN KEY objectID REFERENCES objects(id),
   FOREIGN KEY propID REFERENCES objType_properties(id)
)


Из сложностей которые в итоге у меня вылезали это:
1. Параллельная связь с objectTypes(id) у objects(typeID) и objType_properties(typeID), т.е. необходимо перед добавлением данных к объекту проверять что свойство есть среди тех которые приписаны такому то типу объектов.
2. При изменении набора свойств у типа объектов тоже жопа какая-то была.
3. По идее типы значений свойств тоже могут быть разные (числа, тексты, строки, блобы) я это делал коряво конечно, но для меня работало таким образом: В таблице objectType_properties ещё было поле с типом значения свойства (0-INT, 1-FLOAT и т.д.), а в таблице objectProperties были поля не propData а propINT, propFLOAT, propSTRING, propTEXT
...
Рейтинг: 0 / 0
Связь по внешнему ключу к нескольким таблицам
    #39139737
mad_nazgul
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
G00dWINe,

IMHO проще решать конкретную задачу, чем пытаться сделать "универсальное" решение.
Чтобы хранить данные без четко определенной структуры не нужна СУБД. Проще взять что-нибудь типа JSON.
А так если все таки хотите "универсальность", то EAV вам в помощь.
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Связь по внешнему ключу к нескольким таблицам
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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