|
|
|
Наследование в таблицах
|
|||
|---|---|---|---|
|
#18+
Есть три таблицы: 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 ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.02.2008, 14:31 |
|
||
|
Наследование в таблицах
|
|||
|---|---|---|---|
|
#18+
ООП - это замечательная парадигма, позволяющая представить вещи намного сложнее, чем они есть :) . Там, где без ООП работа с БД - час и 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 применительно РМД оно ни к чему - там уже всё есть, ни отнять, ни прибваить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.02.2008, 01:45 |
|
||
|
Наследование в таблицах
|
|||
|---|---|---|---|
|
#18+
Спасибо за советы, очень помогли. 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. Также в системе предусмотрен поиск юзеров, независимо от типа юзера. Т.е. в случае копироваия атрибутов в наследующую сущность, поиск надо будет осуществлять сразу по двум таблицам. Если не копировать то поиск будет идти тоько по одной таблице. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.02.2008, 09:59 |
|
||
|
Наследование в таблицах
|
|||
|---|---|---|---|
|
#18+
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 определить тип. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.02.2008, 13:33 |
|
||
|
|

start [/forum/search_topic.php?author=hed&author_mode=last_posts&do_search=1]: |
0ms |
get settings: |
10ms |
get forum list: |
19ms |
get settings: |
9ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
204ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
52ms |
get tp. blocked users: |
1ms |
| others: | 474ms |
| total: | 805ms |

| 0 / 0 |
