Модераторы: LSD

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Связь с 2-мя таблицами через одну строку, как это реализовать? 
:(
    Опции темы
Roo
  Дата 28.12.2005, 13:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 75
Регистрация: 17.10.2005

Репутация: нет
Всего: нет



Одна таблица должна быть связана по логике с двумя другими таблицами. Но, опять же по логике, только через одно поле. Т.е. в зависимости от конкретной строки (значение опред. поля либо =, либо != null) строка должна быть связана либо с одной таблицей, либо с другой. Как в такой ситуации по-грамотному спроектировать БД?
PM MAIL   Вверх
Akina
Дата 28.12.2005, 13:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 13
Всего: 454



Цитата(Roo @ 28.12.2005, 14:05)
Как в такой ситуации по-грамотному спроектировать БД?

Разделить таблицу на две - в одной null, в другой не null. Другого способа сохранения логики не вижу.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Roo
Дата 28.12.2005, 13:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 75
Регистрация: 17.10.2005

Репутация: нет
Всего: нет



Цитата
Разделить таблицу на две

В смысле, ввести 2 поля? Одно для одной табл., другое - для другой?
PM MAIL   Вверх
chief39
Дата 28.12.2005, 16:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


карманная тигра
***


Профиль
Группа: Участник Клуба
Сообщений: 1631
Регистрация: 20.5.2005
Где: Киев

Репутация: 8
Всего: 77



Знакомая ситуёвина smile
Ну что ж, поехали:

таблица MAIN содержит поле
ID NOT NULL
таблица sub1 содержит такое же поле
ID NOT NULL

таблица sub2 аналогична sub1
......

Внешние ключи subX.ID ссылаются на MAIN.ID

Теперь главное: надо сразу написать движок, который будет
поддерживать целостность в этих узелках.
То есть обеспечивать инсерты, делиты, апдэйты ключевых полей.
Небольшой но продуманный и быстренький. И всё, кроме селектов, ОБЯЗАНО будет
работать только через него. Лучше всего с помощью SP, которые пойдут как
обязательная часть БД.

В подтверждение скажу что по такому принципу спроектирована одна хорошо
известная мне система. на главную таблицу таким макаром ссылаются до десятка
таблиц. Причём таких узелков несколько в системе. Один раз написанный движок
органично дополнил встроенные механизмы контроля целостности СУБД. Всё это
чудовище работает уже почти 10 лет(!) у одной крупной международной компании
без нареканий. То есть ни одной траблы из-за того что часть функций на движке -
не было. smile

Посему рекомендую как опробованное техническое решение(Жаль что стандарт СКЛ таких механизмов не предполагает smile )

Это сообщение отредактировал(а) chief39 - 28.12.2005, 16:15


--------------------
Люди - это свечи. Они либо горят, либо их - в жопу!(с)

PM MAIL   Вверх
Roo
Дата 28.12.2005, 18:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 75
Регистрация: 17.10.2005

Репутация: нет
Всего: нет



СПАСИБО за совет

Цитата
Жаль что стандарт СКЛ таких механизмов не предполагает

Это точно
PM MAIL   Вверх
Akina
Дата 29.12.2005, 10:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 13
Всего: 454



Цитата(chief39 @ 28.12.2005, 17:11)
Жаль что стандарт СКЛ таких механизмов не предполагает

Такой механизм не отвечает требованиям нормализованности.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
chief39
Дата 29.12.2005, 11:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


карманная тигра
***


Профиль
Группа: Участник Клуба
Сообщений: 1631
Регистрация: 20.5.2005
Где: Киев

Репутация: 8
Всего: 77



Цитата(Akina @ 29.12.2005, 10:13)
Такой механизм не отвечает требованиям нормализованности.

Абсолютно согласен. Но иногда приходится жертвовать красотой кода и идеальной структурой данных в угоду скорости, простоте и прочим богам. Жестокий иррациональный мир. В котором даже число ПИ - не очень круглое smile
P.S.
Roo, как успехи? Подводные камни попадаются или семь футов под килем?


--------------------
Люди - это свечи. Они либо горят, либо их - в жопу!(с)

PM MAIL   Вверх
YurikGL
Дата 2.1.2006, 20:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 196
Регистрация: 5.7.2005
Где: Уфа

Репутация: нет
Всего: 2



Если не ошибаюсь, подобные штуки можно реализовать в СУБД, в которых поддерживается наследование таблиц.
Если это не представляется возможным, то проверку целостности можно организовать на триггерах, хотя, существуют случаи, когда триггерная целостность не работает. Тем не менее, ИМХО самым простым решением была бы организация проверки целостности триггерами, а выборки с помощью хранимых процедур.

--------------------
 
PM MAIL WWW ICQ   Вверх
chief39
Дата 3.1.2006, 11:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


карманная тигра
***


Профиль
Группа: Участник Клуба
Сообщений: 1631
Регистрация: 20.5.2005
Где: Киев

Репутация: 8
Всего: 77



Цитата(YurikGL @ 2.1.2006, 20:29)
Если не ошибаюсь, подобные штуки можно реализовать в СУБД, в которых поддерживается наследование таблиц.

Можно подробнее? ОО БД? Я думаю всем будет интересно.

Цитата(YurikGL @ 2.1.2006, 20:29)
Если это не представляется возможным, то проверку целостности можно организовать на триггерах,

Всё равно, при изменении данных, заранее известно какая из субтаблиц будет затронута и необходимы данные специфические для данной таблицы. Посему процедуры необходимы в любом случае. В них и будет контроль целостности. А если выбросить его в триггера - это лишнее распыление логики(и, возможно, замедление работы).

Цитата(YurikGL @ 2.1.2006, 20:29)
а выборки с помощью хранимых процедур.

Для самых ходовых случаев. Но, как показал опыт, зачастую запросы, использующие эти таблицы, могут быть разнообразнейшими и количество их будет расти, поэтому все выборки не запихнуть в процедуры. Логичнее сделать вьюхи. По одной на каждую связку: субтаблица+основная таблица.

P.S. О наследование таблиц можно ссылочку? Мне теперь и самому интересно smile


--------------------
Люди - это свечи. Они либо горят, либо их - в жопу!(с)

PM MAIL   Вверх
YurikGL
Дата 3.1.2006, 13:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 196
Регистрация: 5.7.2005
Где: Уфа

Репутация: нет
Всего: 2



Цитата(chief39 @ 3.1.2006, 11:50)
Можно подробнее? ОО БД? Я думаю всем будет интересно.

Скажу сразу, что реально я с ОО БД не работал.
Почитать можно, например, здесь
http://zeus.sai.msu.ru:7000/database/artic...rt_28_3_3.shtml

Самая известная объектная СУБД это - PostgreSQL

Так, запрос в яндексе "наследование таблиц PostgreSQL" вывел меня на http://amsand.narod.ru/articles/psql.html


Цитата(chief39 @ 3.1.2006, 11:50)
Всё равно, при изменении данных, заранее известно какая из субтаблиц будет затронута и необходимы данные специфические для данной таблицы. Посему процедуры необходимы в любом случае. В них и будет контроль целостности. А если выбросить его в триггера - это лишнее распыление логики(и, возможно, замедление работы).


Все же какая-то бизнес-логика должна быть? В конце концов, можно ввести поле, которое будет однозначно указывать, с какой таблицей должна быть обеспечена целостность.
А с триггерами проблема не столько в производительности, сколько факт, что они не всегда реально обеспечивают целостность. В одном из факов видел пример, как можно обмануть триггерную целостность.
--------------------
 
PM MAIL WWW ICQ   Вверх
LSD
Дата 3.1.2006, 13:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 24
Всего: 538



Цитата(chief39 @ 3.1.2006, 11:50)
Всё равно, при изменении данных, заранее известно какая из субтаблиц будет затронута и необходимы данные специфические для данной таблицы. Посему процедуры необходимы в любом случае. В них и будет контроль целостности. А если выбросить его в триггера - это лишнее распыление логики(и, возможно, замедление работы).

Тут есть один недостаток: в этих процедурах требуется устанавливать некую общую блокировку (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.
PM MAIL WWW   Вверх
Akina
Дата 4.1.2006, 01:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 13
Всего: 454



Цитата(YurikGL @ 2.1.2006, 21:29)
проверку целостности можно организовать на триггерах

Как-то эта фраза меня аж в ступор ввела поначалу...

Если возникает при каких-либо мыслимых условиях необходимость организовывать ПРОВЕРКУ целостности - это нонсенс, это БД, в которой целостности нет от рождения. Т.е. единственный допустимый механизм нарушения целостности - это физическое разрушение части данных в файлах данных. Все остальное ОБЯЗАНО быть организовано так, чтобы разрушения целостности не было.

Отсюда - триггеры есть всего лишь средство (причем одно из) ПОДДЕРЖАНИЯ и ОБЕСПЕЧЕНИЯ целостности, причем суть выполняемых ими действий - это всего лишь выполнение каскадных изменений в соответствии с заложенной логикой целостности. Которое (средство то есть, в смысле триггеры) гроша ломаного не стОит, если не обернуто в транзакции.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
YurikGL
Дата 4.1.2006, 08:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 196
Регистрация: 5.7.2005
Где: Уфа

Репутация: нет
Всего: 2



Цитата

Как-то эта фраза меня аж в ступор ввела поначалу...

Разумеется, не проверки, а обеспечения smile

Имелось в виду, что внешние ключи нельзя заменять триггерами...

--------------------
 
PM MAIL WWW ICQ   Вверх
Vitkaz
  Дата 12.11.2008, 22:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 90
Регистрация: 29.11.2006

Репутация: нет
Всего: нет



А вообще может одна таблица связана с другими двумя одним полем ?
PM MAIL   Вверх
Zloxa
Дата 13.11.2008, 10:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 11
Всего: 161



"ПО ЛОГИКЕ", так и давайте делать логикой. Логическая надстройка над физикой - вьюхи. А физику давайте реализовывать по законам физики. И не надо никаких извращений. Задача выеденного яйца не стоит.

Код

create table table1(id number primary key);
create table table2(id number primary key);
create table my_table(
   id number primary key
   ,Ref1 number references table1(id)
   ,Ref2 number references table2(id)
   ,Switcher char(1)
   ,constraint my_table$swch$chk check (Switcher is null and Ref1 is not null or Switcher is not null and ref2 is not null)
);
create or replace view my_view as 
  select id
          ,case when Switcher is null then Ref1
                   else Ref2
           end Ref
           ,Switcher
   from my_table;
create or replace trigger my_view$ii instead of insert on my_view
begin
  insert into my_table values(:new.id
                              ,case when :new.Switcher is null then :new.ref end
                              ,case when :new.Switcher is not null then :new.ref end
                              ,:new.Switcher);
end;
/
create or replace trigger my_view$iu instead of update on my_view
begin
  update my_table
    set ref1 = case when :new.Switcher is null then :new.ref end
        ,ref2 = case when :new.Switcher is not null then :new.ref end
        ,switcher = :new.Switcher
  where id = :new.id;
end;
/


ПС. Не посмотрел на дату старта топика :((( Как бы там ни было, пост оставляю.

Это сообщение отредактировал(а) Zloxa - 13.11.2008, 10:42


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Общие вопросы по базам данных"
LSD
Zloxa

Данный форум предназначен для обсуждения вопросов о базах данных не попадающих под тематику других форумов:

  • вопросам по СУБД для которых нет отдельных подфорумов
  • вопросам которые затрагивают несколько разных СУБД (например проблема выбора)
  • инструменты для работы с СУБД
  • вопросы проектирования БД
  • теоретически вопросы о СУБД

Данный форум не предназначен для:

  • вопросов о поиске разлиных БД (если не понимаете чем БД отличается от СУБД то: а) вам не сюда; б) Google в помощь)
  • обсуждения проблем с доступом к СУБД из различных ЯП (для этого есть соответсвующие форумы по каждому ЯП)
  • обсуждения проблем с написание SQL запросов, для этого есть форум Составление SQL-запросов
  • просьб о написании курсовой, реферата и т.п., для этого есть Центр помощи или фриланс биржа
  • объявлений о найме специалистов, для этого есть раздел Объявления о найме специалистов

Если вы не соблюдаете эти правила, не удивляйтесь потом не найдя свою тему/сообщение. ;)


Полезные советы:

При написании сообщения постарайтесь дать теме максимально понятное название. В теме максимально подробно опишите проблему. Если применимо укажите: название базы данных и версии (MySQL 4.1, MS SQL Server 2000 и т.п.); используемых язык программирования; способа доступа (ADO, BDE и т.д.); сообщения об ошибках.

Для вставки кода используйте теги [code=sql] [/code].

Литературу по базам данных можно поискать здесь.

Действия модераторов можно обсудить здесь.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, LSD, Zloxa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | СУБД, общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0736 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.