![]() |
|
Модераторы: LSD |
![]()
|
|
| Roo |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 75 Регистрация: 17.10.2005 Репутация: нет Всего: нет |
Одна таблица должна быть связана по логике с двумя другими таблицами. Но, опять же по логике, только через одно поле. Т.е. в зависимости от конкретной строки (значение опред. поля либо =, либо != null) строка должна быть связана либо с одной таблицей, либо с другой. Как в такой ситуации по-грамотному спроектировать БД?
|
|||
|
||||
| Akina |
|
|||
|
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 13 Всего: 454 |
Разделить таблицу на две - в одной null, в другой не null. Другого способа сохранения логики не вижу. -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
| Roo |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 75 Регистрация: 17.10.2005 Репутация: нет Всего: нет |
В смысле, ввести 2 поля? Одно для одной табл., другое - для другой? |
|||
|
||||
| chief39 |
|
|||
![]() карманная тигра ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1631 Регистрация: 20.5.2005 Где: Киев Репутация: 8 Всего: 77 |
Знакомая ситуёвина
Ну что ж, поехали: таблица MAIN содержит поле ID NOT NULL таблица sub1 содержит такое же поле ID NOT NULL таблица sub2 аналогична sub1 ...... Внешние ключи subX.ID ссылаются на MAIN.ID Теперь главное: надо сразу написать движок, который будет поддерживать целостность в этих узелках. То есть обеспечивать инсерты, делиты, апдэйты ключевых полей. Небольшой но продуманный и быстренький. И всё, кроме селектов, ОБЯЗАНО будет работать только через него. Лучше всего с помощью SP, которые пойдут как обязательная часть БД. В подтверждение скажу что по такому принципу спроектирована одна хорошо известная мне система. на главную таблицу таким макаром ссылаются до десятка таблиц. Причём таких узелков несколько в системе. Один раз написанный движок органично дополнил встроенные механизмы контроля целостности СУБД. Всё это чудовище работает уже почти 10 лет(!) у одной крупной международной компании без нареканий. То есть ни одной траблы из-за того что часть функций на движке - не было. Посему рекомендую как опробованное техническое решение(Жаль что стандарт СКЛ таких механизмов не предполагает Это сообщение отредактировал(а) chief39 - 28.12.2005, 16:15 -------------------- Люди - это свечи. Они либо горят, либо их - в жопу!(с) |
|||
|
||||
| Roo |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 75 Регистрация: 17.10.2005 Репутация: нет Всего: нет |
СПАСИБО за совет
Это точно |
|||
|
||||
| Akina |
|
|||
|
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 13 Всего: 454 |
Такой механизм не отвечает требованиям нормализованности. -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
| chief39 |
|
|||
![]() карманная тигра ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1631 Регистрация: 20.5.2005 Где: Киев Репутация: 8 Всего: 77 |
Абсолютно согласен. Но иногда приходится жертвовать красотой кода и идеальной структурой данных в угоду скорости, простоте и прочим богам. Жестокий иррациональный мир. В котором даже число ПИ - не очень круглое P.S. Roo, как успехи? Подводные камни попадаются или семь футов под килем? -------------------- Люди - это свечи. Они либо горят, либо их - в жопу!(с) |
|||
|
||||
| YurikGL |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 196 Регистрация: 5.7.2005 Где: Уфа Репутация: нет Всего: 2 |
Если не ошибаюсь, подобные штуки можно реализовать в СУБД, в которых поддерживается наследование таблиц.
Если это не представляется возможным, то проверку целостности можно организовать на триггерах, хотя, существуют случаи, когда триггерная целостность не работает. Тем не менее, ИМХО самым простым решением была бы организация проверки целостности триггерами, а выборки с помощью хранимых процедур. --------------------
|
|||
|
||||
| chief39 |
|
||||||
![]() карманная тигра ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1631 Регистрация: 20.5.2005 Где: Киев Репутация: 8 Всего: 77 |
Можно подробнее? ОО БД? Я думаю всем будет интересно.
Всё равно, при изменении данных, заранее известно какая из субтаблиц будет затронута и необходимы данные специфические для данной таблицы. Посему процедуры необходимы в любом случае. В них и будет контроль целостности. А если выбросить его в триггера - это лишнее распыление логики(и, возможно, замедление работы).
Для самых ходовых случаев. Но, как показал опыт, зачастую запросы, использующие эти таблицы, могут быть разнообразнейшими и количество их будет расти, поэтому все выборки не запихнуть в процедуры. Логичнее сделать вьюхи. По одной на каждую связку: субтаблица+основная таблица. P.S. О наследование таблиц можно ссылочку? Мне теперь и самому интересно -------------------- Люди - это свечи. Они либо горят, либо их - в жопу!(с) |
||||||
|
|||||||
| YurikGL |
|
||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 196 Регистрация: 5.7.2005 Где: Уфа Репутация: нет Всего: 2 |
Скажу сразу, что реально я с ОО БД не работал. Почитать можно, например, здесь http://zeus.sai.msu.ru:7000/database/artic...rt_28_3_3.shtml Самая известная объектная СУБД это - PostgreSQL Так, запрос в яндексе "наследование таблиц PostgreSQL" вывел меня на http://amsand.narod.ru/articles/psql.html
Все же какая-то бизнес-логика должна быть? В конце концов, можно ввести поле, которое будет однозначно указывать, с какой таблицей должна быть обеспечена целостность. А с триггерами проблема не столько в производительности, сколько факт, что они не всегда реально обеспечивают целостность. В одном из факов видел пример, как можно обмануть триггерную целостность. --------------------
|
||||
|
|||||
| LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 24 Всего: 538 |
Тут есть один недостаток: в этих процедурах требуется устанавливать некую общую блокировку (select for update, lock table или нечто более специфичное типа dbms_lock). И в большинсве случаев блокировка будет захватывать данных, больше чем надо. -------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
|||
|
||||
| Akina |
|
|||
|
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 13 Всего: 454 |
Как-то эта фраза меня аж в ступор ввела поначалу... Если возникает при каких-либо мыслимых условиях необходимость организовывать ПРОВЕРКУ целостности - это нонсенс, это БД, в которой целостности нет от рождения. Т.е. единственный допустимый механизм нарушения целостности - это физическое разрушение части данных в файлах данных. Все остальное ОБЯЗАНО быть организовано так, чтобы разрушения целостности не было. Отсюда - триггеры есть всего лишь средство (причем одно из) ПОДДЕРЖАНИЯ и ОБЕСПЕЧЕНИЯ целостности, причем суть выполняемых ими действий - это всего лишь выполнение каскадных изменений в соответствии с заложенной логикой целостности. Которое (средство то есть, в смысле триггеры) гроша ломаного не стОит, если не обернуто в транзакции. -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
| YurikGL |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 196 Регистрация: 5.7.2005 Где: Уфа Репутация: нет Всего: 2 |
Разумеется, не проверки, а обеспечения Имелось в виду, что внешние ключи нельзя заменять триггерами... --------------------
|
|||
|
||||
| Vitkaz |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 90 Регистрация: 29.11.2006 Репутация: нет Всего: нет |
А вообще может одна таблица связана с другими двумя одним полем ?
|
|||
|
||||
| Zloxa |
|
|||
|
Чо? ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3473 Регистрация: 12.9.2008 Репутация: 11 Всего: 161 |
"ПО ЛОГИКЕ", так и давайте делать логикой. Логическая надстройка над физикой - вьюхи. А физику давайте реализовывать по законам физики. И не надо никаких извращений. Задача выеденного яйца не стоит.
ПС. Не посмотрел на дату старта топика :((( Как бы там ни было, пост оставляю. Это сообщение отредактировал(а) Zloxa - 13.11.2008, 10:42 -------------------- Достоверно известно, что 89% людей доверяют статистике взятой с потолка |
|||
|
||||
![]()
|
| Правила форума "Общие вопросы по базам данных" | |
|
|
Данный форум предназначен для обсуждения вопросов о базах данных не попадающих под тематику других форумов:
Данный форум не предназначен для:
Если вы не соблюдаете эти правила, не удивляйтесь потом не найдя свою тему/сообщение.
Полезные советы: Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, LSD, Zloxa. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | СУБД, общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |