powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Наследование в таблицах
5 сообщений из 5, страница 1 из 1
Наследование в таблицах
    #35152450
J_Developer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть три таблицы:

USER {type, ...}
EMPLOYER {...}
EMPLOYEE {...}

Таблица EMPLOYER наследует и расширяет таблицу USER (т.е. имеет FK на таблицу USER)
Таблица EMPLOYEE наследует и расширяет таблицу USER (т.е. имеет FK на таблицу USER)

Поле type в таблице USER определяет ти юзера EMPLOYER или EMPLOYEE

Т.е. что у меня сейчас происходит,

сперва делается SELECT id, fname, lname, type FROM user WHERE login='login' AND password='password' таким образом я получаю основные данные из таблицы USER и самое главное определяю его тип (type)

Потом делаю второй селект, таблица по которой делается SELECT зависит от ранее полученого type, т.е. либо из селект из EMPLOYER либо из EMPLOYEE

Таким образом целых два SELECT чтобы получить все данные.


Можно ли как то это сделать по другому ? Т.е. хотелось бы в одном запросе (с JOINом) выбрать сразу целиком либо EMPLOYER либо EMPLOYEE

Как правильно делается наследование на уровне DB ?
...
Рейтинг: 0 / 0
Наследование в таблицах
    #35152921
AlexTheRaven
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ООП - это замечательная парадигма, позволяющая представить вещи намного сложнее, чем они есть :) . Там, где без ООП работа с БД - час и 10 строчек, с ООП, зачастую, десяток классов, пара паттернов, изящное решение и мифический человеко-месяц на отладку.

Конечно, можно называть это и наследованием, но вообще-то налицо обычная связь сущностей
user [1,1] - [0,1] employer
user [1,1] - [0,1] employee

С JOIN'ом всё очень легко сделать, например:
SELECT * FROM user JOIN employer ON user.id=employer.user_id
* очень желательно заменить на перечисление необходимых атрибутов. Учите SQL.

Вообще в РМД наследование можно реализовать
- связью [1,1] - [0,1] (наследование конкретного класса)
- связью [1,1] - [1,1] (наследование абстрактного класса, нонсенс с точки зрения теории)
- копированием атрибутов наследуемой сущности в наследующую (в этом случае значительно упрощаются SQL-запросы - сами себе потом спасибо скажете).

В каждом "объектном расширении", специфическом для СУБД, наследование реализуется по-своему.

Но зачем здесь пользоваться термином "наследование"? IMHO применительно РМД оно ни к чему - там уже всё есть, ни отнять, ни прибваить.
...
Рейтинг: 0 / 0
Наследование в таблицах
    #35153034
VinniPuh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо за советы, очень помогли.

AlexTheRaven
С JOIN'ом всё очень легко сделать, например:
SELECT * FROM user JOIN employer ON user.id=employer.user_id
* очень желательно заменить на перечисление необходимых атрибутов. Учите SQL.


Про JOIN я немного другое имел ввиду (как им пользоваться я знаю, знаю про * тоже).
Хотелось бы чего то интелектуаьного, т.е. незная типа юзера сделать select который вытянет данные либо employer либо employee. В том примере, который вы привели мы заведомо знаем, что надо джоинить с employer, т.е. все равно надо делать два селекта сперва, который получит тип юзера, а второй, чтобы вытянуть employer либо employee в зависимости от типа.

AlexTheRaven
- копированием атрибутов наследуемой сущности в наследующую (в этом случае значительно упрощаются SQL-запросы - сами себе потом спасибо скажете).


Все бы хорошо но все аттрибуты скопировать неполучится, например login и password. Также в системе предусмотрен поиск юзеров, независимо от типа юзера. Т.е. в случае копироваия атрибутов в наследующую сущность, поиск надо будет осуществлять сразу по двум таблицам. Если не копировать то поиск будет идти тоько по одной таблице.
...
Рейтинг: 0 / 0
Наследование в таблицах
    #35153301
AlexTheRaven
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VinniPuhСпасибо за советы, очень помогли.
Про JOIN я немного другое имел ввиду (как им пользоваться я знаю, знаю про * тоже).
Хотелось бы чего то интелектуаьного, т.е. незная типа юзера сделать select который вытянет данные либо employer либо employee. В том примере, который вы привели мы заведомо знаем, что надо джоинить с employer, т.е. все равно надо делать два селекта сперва, который получит тип юзера, а второй, чтобы вытянуть employer либо employee в зависимости от типа.

В принципе, ничего не мешает написать:
SELECT * FROM
user
LEFT JOIN employer ON user.id=employer.user_id
LEFT JOIN employee ON user.id=employee.user_id
И потом понять тип по тому, атрибуты какой сущности не NULL.

AlexTheRaven
Все бы хорошо но все аттрибуты скопировать неполучится, например login и password. Также в системе предусмотрен поиск юзеров, независимо от типа юзера. Т.е. в случае копироваия атрибутов в наследующую сущность, поиск надо будет осуществлять сразу по двум таблицам. Если не копировать то поиск будет идти тоько по одной таблице.
Не невозможно, но решение получается кривое решение:
employeer (id, login, password, ...)
employee (id, login, password, ...)
Интервалы id для employeer и employee - различные.
Тогда можно написать:
SELECT id, login, password FROM
((SELECT id, login, password FROM employer WHERE...)
UNION
(SELECT id, login, password FROM employee WHERE...))
и по id определить тип.
...
Рейтинг: 0 / 0
Наследование в таблицах
    #35153361
J_Developer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо !
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Наследование в таблицах
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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