powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Имитация наследования в РБД
8 сообщений из 8, страница 1 из 1
Имитация наследования в РБД
    #32302775
Фотография Varan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть два вида "объектов", определенные характеристики объектов одного вида в определенном сиысле зависят от "состояния" объектов другого вида. К примеру, есть "объект" комната и "объект" электрическая лампочка. В каждой комнате есть только один выключатель, который включает/выключает все лампочки в данной комнате. Задача - как только объект "комната" перешел в состояние "выключатель включен", все объекты "лампочка" данной комнаты должны перейти в состояние "лампа включена" и наоборот.
В БД это можно сделать так:
Табл Комнаты (ID комнаты,Выключатель включен(boolean), и.т.п)
Табл Лампочки (ID лампочки, FK комнаты, Лампа включена (boolean)
После того, как какие-то флажки столбца "выключатель включен" изменили свое значение, необходимо запускать запрос, который изменит соответсвующее значение "выключатель включен" таблицы Лампочки.
В этом деле меня смущает следующее: при такой системе происходит дублирование информации, приходится запускать дополнительный запрос. Если же считать, что лампочка включена по состоянию флага родительской комнаты, получается не очень красиво.
В общем, меня интересует, как по-научному решается данная проблема.
...
Рейтинг: 0 / 0
Имитация наследования в РБД
    #32302853
Фотография Павел Воронцов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Varan писал:Если же считать, что лампочка включена по состоянию флага родительской комнаты, получается не очень красиво

Почему некрасиво? Именно так и решается. Каждый факт должен быть отражен ровно в одном месте - закон реляционной теории.
...
Рейтинг: 0 / 0
Имитация наследования в РБД
    #32302880
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если же считать, что лампочка включена по состоянию флага родительской комнаты, получается не очень красиво.
Очень даже красиво получается, зачем делать дублирование информации, при условии, что выключатель действует на все лампочки. Потом пишем просто вьювер:
Код: plaintext
1.
2.
3.
create view v_СостояниеЛампочек as
  select l.*, k.ВыключательВключен
  from Комнаты k
    inner join Лампочки l on l.ID_Комнаты = k.ID_Комнаты

и когда надо всегда по нему узнаем состояния лампочек.

Первый предложенный вами вариант я считаю не годиться, так как не соотвествует правилам нормализации данных. Если рассматривать такую постановку, где выключатель действует не на все лампочки, значит появиться еще таблица "Выключатели в комнате" и дальше лампочки будут по ним привязываться. Если рассматривать случай, когда выключатель действует на все лампочки, но состояния некоторых из них было изменено вручную (например лампочка сгорела или же ее выкрутили), то можно сделать с помощью как раз наследования аттрибутов дочерних обьектов от родительских:
3 таблицы:
Комнаты (ID_комнаты,Выключатель)
Лампочки (ID_лампочки, ID_комнаты)
РеальноеСостояние(ID лампочки, Выключатель)
В таблицу РеальноеСостояние пишем только те лампочки, которые работают не зависимо от выключателя комнаты. Так же пишем вьювер:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
create view v_ЛампочкиСостояние as
  select ID_Лампочки, Выключатель
  from РеальноеСостояние
  union all
  select l.ID_Лампочки, k.Выключатель
  from Комнаты k
    inner join Лампочки l on l.ID_Комнаты = k.ID_Комнаты
  where not exists(
    select * 
    from РеальноеСостояние s 
    where s.ID_Лампочки = l.ID_Лампочки )

В итоге такой вьювер вернет все состояния индивидуально измененных лампочек и состояния выключателя комнаты для всех лампочек, для которых не описаны отклонения в работе.
...
Рейтинг: 0 / 0
Имитация наследования в РБД
    #32305903
Фотография Varan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ASCRUS
Все это, конечно, правильно. Вот только в этом вопросе меня смущает следующее. Понятие "выключатель включен" и "лампочка горит" это по смыслу не одно и то же. Все ж таки это некий косвенный способ узнать состояние лампочки. Мне как-то ближе вариант, когда информация о состоянии лампочки хранится вместе с лампочкой, хоть это и вносит некоторую избыточность. Зато. если корректно написать "передаточную функцию", задающую изменение состояния лампочки в зависимости от изменения состояния выключателя, в дальнейшем получать информацию о состоянии лампочек будет проще, чем в случае вычисления этих состояний по значению определенных параметров родительских объектов.
...
Рейтинг: 0 / 0
Имитация наследования в РБД
    #32305932
Фотография U-gene
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
....Ближе, ближе надо быть к реальности :) Не отрываться от нее, а наоборот, всячески реализовывать в наших проектах (практически нереализуемых).... Ура, товарищи!!!....

....Например в лампочке может появиться флаг "сгорела"(выключатель включен, а лампа не горит)...Или вдруг потребуется в комнате поставить второй(3,4,...) выключатель? в любом случае выриант с передаточной функцией более приемлем... а почему? см. 1-й абзац....
...
Рейтинг: 0 / 0
Имитация наследования в РБД
    #32306323
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все решается конкретными условиями постановки. Если вешать флаг на лампочки, то недого написать триггер на обновление выключателя и на автопилоте всем лампочкам записывать это состояние. Если лампочек миллионы или они пронумерованны и в постановке сказано, что их могут перемещать из комнаты в комнату, то схема ссылки на выключатель более эффективная, так как при изменении состояния выключателя или же перемещении лампочки из комнаты в комнату не надо лопатить огромные обьемы данных и всем выставлять один и тот же флаг. Если хотят вести учет лампочек - когда и в какой комнате была зарегистрированна, какие были периоды между включением и выключением и т.д. - то структура еще больше усложняется и опять же выгоднее получается ссылаться на информацию родительского обьекта, чем хранить историю включения/выключения каждой лампочки. Ну и т.д. и т.п. Каждое решение имеет право быть, если оно удовлетворяет постановке. Однако честно говоря мне было бы лень даже если в задаче всего 3 лампочки писать из за этого триггер - сказано, что лампочки всегда от выключателя зависят, значит для меня вьювер самое удобное решение.

U-gene
Например в лампочке может появиться флаг "сгорела"(выключатель включен, а лампа не горит)...Или вдруг потребуется в комнате поставить второй(3,4,...) выключатель?
если Вы не против я процитирую самого себя:
Если рассматривать такую постановку, где выключатель действует не на все лампочки, значит появиться еще таблица "Выключатели в комнате" и дальше лампочки будут по ним привязываться. Если рассматривать случай, когда выключатель действует на все лампочки, но состояния некоторых из них было изменено вручную (например лампочка сгорела или же ее выкрутили), то можно сделать ...
Я заметил небольшую разницу в наших высказываниях - я изначально на уровне постановки прогнозирую критические ситуации и проектирую решение, Вы же рассматриваете условия динамического изменения постановки реального проекта.
Мне кажется, что легче чем хранить избыточную информацию на все случаи жизни, легче один раз все четко описать в постановке. Если в постановке "вдруг" что то появлется новенькое, значит постановка изначально не была до конца проанализирована на все критические случаи жизни и соотвествующе структура БД была не правильно спроектированна.
...
Рейтинг: 0 / 0
Имитация наследования в РБД
    #32306417
Фотография U-gene
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИМХО можно пытаться, однако невозможно спрогнозировать ВСЕ ситуации. Опять же, спроектируешь, а оно БАЦ! и не пригодиться.... обидно, да? :)
На самом деле я немного другим заморочен, а именно возможностью именно таких, незапланированных изменений (как бы этого не хотелось), и наколько легко такие изменения делать. Но это к данной теме не очень относится.
...
Рейтинг: 0 / 0
Имитация наследования в РБД
    #32306470
Фотография Varan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"На самом деле я немного другим заморочен, а именно возможностью именно таких, незапланированных изменений (как бы этого не хотелось), и наколько легко такие изменения делать"
Так вот в чем дело! Теперь понятно, откуда моя "неудовлетворенность" идеальным решением ASCRUS. ASCRUS не только полностью решил поставленную задачу, но и наметил пути решения "расширенных" вариантов задач, но все равно у меня (чисто субъективно) осталось ощущение, что при определенном варианте изменения постановки задачи придется все переделывать. Я начинаю прокручивать варианты, как изменение постановки отразятся на структуре, и настроение портится - я вижу, что стоит немного изменить постановку, как все рушится. Оказывается, я озабочен тем же самым, что и U-gene, только на своем уровне.
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Имитация наследования в РБД
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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