|
Имитация наследования в РБД
|
|||
---|---|---|---|
#18+
Есть два вида "объектов", определенные характеристики объектов одного вида в определенном сиысле зависят от "состояния" объектов другого вида. К примеру, есть "объект" комната и "объект" электрическая лампочка. В каждой комнате есть только один выключатель, который включает/выключает все лампочки в данной комнате. Задача - как только объект "комната" перешел в состояние "выключатель включен", все объекты "лампочка" данной комнаты должны перейти в состояние "лампа включена" и наоборот. В БД это можно сделать так: Табл Комнаты (ID комнаты,Выключатель включен(boolean), и.т.п) Табл Лампочки (ID лампочки, FK комнаты, Лампа включена (boolean) После того, как какие-то флажки столбца "выключатель включен" изменили свое значение, необходимо запускать запрос, который изменит соответсвующее значение "выключатель включен" таблицы Лампочки. В этом деле меня смущает следующее: при такой системе происходит дублирование информации, приходится запускать дополнительный запрос. Если же считать, что лампочка включена по состоянию флага родительской комнаты, получается не очень красиво. В общем, меня интересует, как по-научному решается данная проблема. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.10.2003, 12:29 |
|
Имитация наследования в РБД
|
|||
---|---|---|---|
#18+
Varan писал:Если же считать, что лампочка включена по состоянию флага родительской комнаты, получается не очень красиво Почему некрасиво? Именно так и решается. Каждый факт должен быть отражен ровно в одном месте - закон реляционной теории. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.10.2003, 13:05 |
|
Имитация наследования в РБД
|
|||
---|---|---|---|
#18+
Если же считать, что лампочка включена по состоянию флага родительской комнаты, получается не очень красиво. Очень даже красиво получается, зачем делать дублирование информации, при условии, что выключатель действует на все лампочки. Потом пишем просто вьювер: Код: plaintext 1. 2. 3.
и когда надо всегда по нему узнаем состояния лампочек. Первый предложенный вами вариант я считаю не годиться, так как не соотвествует правилам нормализации данных. Если рассматривать такую постановку, где выключатель действует не на все лампочки, значит появиться еще таблица "Выключатели в комнате" и дальше лампочки будут по ним привязываться. Если рассматривать случай, когда выключатель действует на все лампочки, но состояния некоторых из них было изменено вручную (например лампочка сгорела или же ее выкрутили), то можно сделать с помощью как раз наследования аттрибутов дочерних обьектов от родительских: 3 таблицы: Комнаты (ID_комнаты,Выключатель) Лампочки (ID_лампочки, ID_комнаты) РеальноеСостояние(ID лампочки, Выключатель) В таблицу РеальноеСостояние пишем только те лампочки, которые работают не зависимо от выключателя комнаты. Так же пишем вьювер: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
В итоге такой вьювер вернет все состояния индивидуально измененных лампочек и состояния выключателя комнаты для всех лампочек, для которых не описаны отклонения в работе. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.10.2003, 13:14 |
|
Имитация наследования в РБД
|
|||
---|---|---|---|
#18+
ASCRUS Все это, конечно, правильно. Вот только в этом вопросе меня смущает следующее. Понятие "выключатель включен" и "лампочка горит" это по смыслу не одно и то же. Все ж таки это некий косвенный способ узнать состояние лампочки. Мне как-то ближе вариант, когда информация о состоянии лампочки хранится вместе с лампочкой, хоть это и вносит некоторую избыточность. Зато. если корректно написать "передаточную функцию", задающую изменение состояния лампочки в зависимости от изменения состояния выключателя, в дальнейшем получать информацию о состоянии лампочек будет проще, чем в случае вычисления этих состояний по значению определенных параметров родительских объектов. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2003, 12:16 |
|
Имитация наследования в РБД
|
|||
---|---|---|---|
#18+
....Ближе, ближе надо быть к реальности :) Не отрываться от нее, а наоборот, всячески реализовывать в наших проектах (практически нереализуемых).... Ура, товарищи!!!.... ....Например в лампочке может появиться флаг "сгорела"(выключатель включен, а лампа не горит)...Или вдруг потребуется в комнате поставить второй(3,4,...) выключатель? в любом случае выриант с передаточной функцией более приемлем... а почему? см. 1-й абзац.... ... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2003, 12:30 |
|
Имитация наследования в РБД
|
|||
---|---|---|---|
#18+
Все решается конкретными условиями постановки. Если вешать флаг на лампочки, то недого написать триггер на обновление выключателя и на автопилоте всем лампочкам записывать это состояние. Если лампочек миллионы или они пронумерованны и в постановке сказано, что их могут перемещать из комнаты в комнату, то схема ссылки на выключатель более эффективная, так как при изменении состояния выключателя или же перемещении лампочки из комнаты в комнату не надо лопатить огромные обьемы данных и всем выставлять один и тот же флаг. Если хотят вести учет лампочек - когда и в какой комнате была зарегистрированна, какие были периоды между включением и выключением и т.д. - то структура еще больше усложняется и опять же выгоднее получается ссылаться на информацию родительского обьекта, чем хранить историю включения/выключения каждой лампочки. Ну и т.д. и т.п. Каждое решение имеет право быть, если оно удовлетворяет постановке. Однако честно говоря мне было бы лень даже если в задаче всего 3 лампочки писать из за этого триггер - сказано, что лампочки всегда от выключателя зависят, значит для меня вьювер самое удобное решение. U-gene Например в лампочке может появиться флаг "сгорела"(выключатель включен, а лампа не горит)...Или вдруг потребуется в комнате поставить второй(3,4,...) выключатель? если Вы не против я процитирую самого себя: Если рассматривать такую постановку, где выключатель действует не на все лампочки, значит появиться еще таблица "Выключатели в комнате" и дальше лампочки будут по ним привязываться. Если рассматривать случай, когда выключатель действует на все лампочки, но состояния некоторых из них было изменено вручную (например лампочка сгорела или же ее выкрутили), то можно сделать ... Я заметил небольшую разницу в наших высказываниях - я изначально на уровне постановки прогнозирую критические ситуации и проектирую решение, Вы же рассматриваете условия динамического изменения постановки реального проекта. Мне кажется, что легче чем хранить избыточную информацию на все случаи жизни, легче один раз все четко описать в постановке. Если в постановке "вдруг" что то появлется новенькое, значит постановка изначально не была до конца проанализирована на все критические случаи жизни и соотвествующе структура БД была не правильно спроектированна. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2003, 15:59 |
|
Имитация наследования в РБД
|
|||
---|---|---|---|
#18+
ИМХО можно пытаться, однако невозможно спрогнозировать ВСЕ ситуации. Опять же, спроектируешь, а оно БАЦ! и не пригодиться.... обидно, да? :) На самом деле я немного другим заморочен, а именно возможностью именно таких, незапланированных изменений (как бы этого не хотелось), и наколько легко такие изменения делать. Но это к данной теме не очень относится. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2003, 16:49 |
|
Имитация наследования в РБД
|
|||
---|---|---|---|
#18+
"На самом деле я немного другим заморочен, а именно возможностью именно таких, незапланированных изменений (как бы этого не хотелось), и наколько легко такие изменения делать" Так вот в чем дело! Теперь понятно, откуда моя "неудовлетворенность" идеальным решением ASCRUS. ASCRUS не только полностью решил поставленную задачу, но и наметил пути решения "расширенных" вариантов задач, но все равно у меня (чисто субъективно) осталось ощущение, что при определенном варианте изменения постановки задачи придется все переделывать. Я начинаю прокручивать варианты, как изменение постановки отразятся на структуре, и настроение портится - я вижу, что стоит немного изменить постановку, как все рушится. Оказывается, я озабочен тем же самым, что и U-gene, только на своем уровне. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2003, 17:08 |
|
|
start [/forum/topic.php?fid=32&fpage=176&tid=1546790]: |
0ms |
get settings: |
8ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
72ms |
get topic data: |
14ms |
get forum data: |
3ms |
get page messages: |
46ms |
get tp. blocked users: |
2ms |
others: | 11ms |
total: | 173ms |
0 / 0 |