|
|
|
Непостоянная транзитивная взаимосвязь
|
|||
|---|---|---|---|
|
#18+
Работаю над структурой части БД, складывается следующая ситуация: 1) Есть таблица с участками производства Sections; 2) В таблице Terminals хранятся данные о терминалах, расположенных на производстве; на каждом участке расположено несколько терминалов (ОДИН ко МНОГИМ): Sections -> Terminals; 3) В таблице Profiles хранятся профили терминалов, профили также соотносятся с секциями Sections -> Profiles (профили специфичны для участков и должны быть к ним привязаны); Все хорошо, но необходимо установить связь Profiles -> Terminals. Но после этого связь Sections->Terminals оказывается вроде как избыточной, потому что транзитивная. С другой стороны, избавиться от нее нельзя, так как во-первых терминал физически соотносится с участком, во-вторых человек ответственный за секцию не должен трогать терминалы, не принадлежащие его секции в момент установления связей в таблице Profiles -> Terminals. В принципе, можно все оставить как есть, но думаю, нет ли какого-то более элегантного решения? ________________________________________________________ Глюк - это высокоорганизованная система не поддающихся определению частиц ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2009, 22:01 |
|
||
|
Непостоянная транзитивная взаимосвязь
|
|||
|---|---|---|---|
|
#18+
Как мне кажется, вам необходима сущность "Виды профилей" (ProfileType). Для каждого вида будут описаны сами "Профили" - Profiles. Тогда получается следующее: Sections ProfileType Terminals: FK Section, FK ProfileType Profiles: PK(FK Section, FK ProfileType) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.10.2009, 06:32 |
|
||
|
Непостоянная транзитивная взаимосвязь
|
|||
|---|---|---|---|
|
#18+
aston, Решение конечно возможное, но дело в том, что каждый профиль органично принадлежит своему участку и особого физического смысла ProfileTypes иметь не будет. Пока я остановился на решении, когда триггер проверяет связь Profiles->Terminals, чтобы треугольник связей в итоге сходился. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.10.2009, 11:26 |
|
||
|
Непостоянная транзитивная взаимосвязь
|
|||
|---|---|---|---|
|
#18+
Проблема типовая. Я действовал также как Вы. Не знаю, есть ли другие рецепты. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.10.2009, 12:35 |
|
||
|
Непостоянная транзитивная взаимосвязь
|
|||
|---|---|---|---|
|
#18+
Не знаю как насчет типизации, я вот подобную схему уже пару раз реализовывал по принципу регистров в 1С: Как видно на рисунке схема 1 избыточна, схема 2 не подходит (хотя опять таки зависит от понятий вложенных в сущности), попробуйте схему 3, которая содержит в себе специфику связи Секций(S), терминалов (T) и профилей (P) отражающейся в сущности template. Например, перемещая профиль (P) в секции (S), достаточно добавить запись для терминала (T) [можно подойти глобальнее и вообще при создании связки SPT регистрировать общие для них данные, что конечно приведет к более продуманным действиям во время проектирования]. Если посмотреть чисто геометрически, то никак не избежать "транзитивности" там, где она задумана. Подумайте по-поводу размножения специфик вводя N сущностей template1 ... templateN. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.10.2009, 18:08 |
|
||
|
Непостоянная транзитивная взаимосвязь
|
|||
|---|---|---|---|
|
#18+
seforsourceНе знаю как насчет типизации, я вот подобную схему уже пару раз реализовывал по принципу регистров в 1С: Как видно на рисунке схема 1 избыточна, схема 2 не подходит (хотя опять таки зависит от понятий вложенных в сущности), попробуйте схему 3, которая содержит в себе специфику связи Секций(S), терминалов (T) и профилей (P) отражающейся в сущности template. Например, перемещая профиль (P) в секции (S), достаточно добавить запись для терминала (T) [можно подойти глобальнее и вообще при создании связки SPT регистрировать общие для них данные, что конечно приведет к более продуманным действиям во время проектирования]. Если посмотреть чисто геометрически, то никак не избежать "транзитивности" там, где она задумана. Подумайте по-поводу размножения специфик вводя N сущностей template1 ... templateN. Интересный вариант, стоит подумать. Правда нужно тогда заводить частично определенные сущности - для терминалов, которым временно профиль не назначен и профилей, которые не сопоставлены ни одному терминалу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.10.2009, 19:23 |
|
||
|
Непостоянная транзитивная взаимосвязь
|
|||
|---|---|---|---|
|
#18+
Я вот тут от Маяковской до Юго-Западной 2 раза думал о Вашей схеме, и вот до чего додумался: S - сущность однозначно определяющая Sections, без зависимостей от P и T; P - сущность однозначно определяющая Terminals, без зависимостей от S и T; T - сущность однозначно определяющая Profiles, без зависимостей от P и S; тогда, если ввести понятие периода в сущность template, то получится картина типа этой: templateID_SID_PID_TНастройкаS+PНастройкаT+PПериод Ссылка на техдокуметацию ПО_Terminals_Profiles Монтаж110341134004x-e=@erЛ70025/05/09Пакет ТД№44win7 Иванов210741934003x-e=@er1Л70025/05/09Пакет ТД№43win7 Иванов Ну, типа того. И вот Вы сменили 4003 терминал на 4005 26/10/09 с использованием настройки Л701, тогда будет: templateID_SID_PID_TНастройкаS+PНастройкаT+PПериод Ссылка на техдокуметацию ПО_Terminals_Profiles Монтаж110341134004x-e=@erЛ70025/05/09Пакет ТД№44win7 Иванов210741934003x-e=@er1Л70025/05/09Пакет ТД№43win7 Иванов310741934005x-e=@er1Л70126/10/09Пакет ТД№115win7 Сидоров Я к чему все это - сущность template отображает уникальность SPT, не имея в себе смысла без отношений S -> template P -> template T -> template. Но может получиться так, что одной сущности template будет недостаточно, или конфигурация в одном отношении поменялась, а в другом отношении осталась прежней, например, при поломке оборудования или при начале монтажа, когда настройка вроде уже есть, а процедура еще не функционирет, тогда придется вводить еще какое-то конечное количество template-ов... Таким Макаром Вы убиваете нескольких зайцев: заяц А - регистр об изменении информации во времени; заяц Б - нет необходимости создавать сущность типовых связок SPT (назовем их Шаблоны SPT), просто копируйте прежние; заяц В - можно получить интересную паутину местоположения и т.п. приблуд, если ввести координаты местоположения в S, то положения (во времени и по координатам S) T и P можно отследить составив 1 SQL с 1 вложенным SQL. А про LelikkПравда нужно тогда заводить частично определенные сущности - для терминалов, которым временно профиль не назначен и профилей, которые не сопоставлены ни одному терминалу. Это правда, но в этом же и прикол ;) Типа "нормальная форма" по "Коду" или как-там... Не знаю я этого, сам не читал. Опять таки это ИМХО. Я институтов не "кончал", поэтому не претендую на похвалы и критику... Я фрезеровщик 3го разряда. Хотя и имею свою контору, клиентов и разработки... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2009, 18:12 |
|
||
|
Непостоянная транзитивная взаимосвязь
|
|||
|---|---|---|---|
|
#18+
seforsource, Я поразмышлял вчера над вашей структурой - то, что вы предлагаете, фактически является связью многие-ко-многим между тремя таблицами. То есть разреженный трехмерный массив. Но проблема просто перетекает в другую плоскость: таблица не будет в 3-ей нормальной форме, так как факт принадлежности Профиля "С1" Секции "С" будет продублирован во всех записях о терминалах, которым назначен профиль "С1" Sections Profiles TerminalsС C1 nullC C1 27C C1 28C C1 32 Тут очень трудно будет поддерживать целостность данных, потому что она должна быть обеспечена определенным сочетанием записей. Так что я пока оставлю структуру треугольничком с триггерной проверкой. В общем, теоретическая нормализация дело Бойса и Кодда :) А на практике приходится выбирать наиболее подходящее нарушение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2009, 21:14 |
|
||
|
Непостоянная транзитивная взаимосвязь
|
|||
|---|---|---|---|
|
#18+
Lelikkтаблица не будет в 3-ей нормальной форме, так как факт принадлежности Профиля "С1" Секции "С" будет продублирован во всех записях о терминалах, которым назначен профиль "С1" Sections Profiles TerminalsС C1 nullC C1 27C C1 28C C1 32 Тут очень трудно будет поддерживать целостность данных, потому что она должна быть обеспечена определенным сочетанием записей. Так что я пока оставлю структуру треугольничком с триггерной проверкой.Если считать ключом комбинацию (Sections, Profiles, Terminals), то никакого нарушения 3НФ нет. Точнее, есть, но оно в наличие NULL в поле Terminals. С теоретической точки зрения считается(Дейт), что в таком случае вообще нельзя говорить о реляционной модели. С практической, если допустим только один NULL на комбинацию (Sections, Profiles), как и любого другого значения Terminal, то можно говорить об уникальном ограничении, которое можно считать каким-никаким, но ключом, так как только одна строка имеет такую комбинацию атрибутов. С другой стороны, можно вводить виртуальный терминал с определённым идентификатором, например, 0 или -1, т.е., фиксированным значением, которое не может принадлежать или быть присвоено ни одному реальному терминалу. Теоретически, не совсем честный ход, появляются так называемые magical values, которые должны учитываться при программировании, практически - почему нет ? Иногда может оказаться очень удобным заменить неопределённое определённым, дабы избежать использование NULL и трёхзначной логики. По стартовому топику не совсем понятна суть проблемы, ибо предметная область напрочь не знакома. И дальнейшее обсуждение ситуации не прояснило. Что такое профиль ? Терминала ? Участка ? Хотя бы вкратце, на уровне понятий. Также хотелось бы увидеть более-менее полный перечень бизнес-правил, если так можно выразиться. Включая возможности существования: терминала вне участков, без профиля; участка без профиля, без терминалов; профиля без участка и терминала. Тогда можно было бы поговорить более конкретно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2009, 03:58 |
|
||
|
Непостоянная транзитивная взаимосвязь
|
|||
|---|---|---|---|
|
#18+
Lelikk, может быть, обеспечить "неприкосновенность" связи "терминал-секция" при изменениях связи "профиль-терминал" просто физически, введением составного внешнего ключа? Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2009, 04:21 |
|
||
|
Непостоянная транзитивная взаимосвязь
|
|||
|---|---|---|---|
|
#18+
NextMan Код: plaintext 1. Спасибо за совет. Внешними составными ключами получается лучше, чем явная реализация триггерами. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2009, 11:27 |
|
||
|
Непостоянная транзитивная взаимосвязь
|
|||
|---|---|---|---|
|
#18+
ChA, Никакой особенной предметной области нет. Бизнес-правила в отношении этиз 3-х сущностей (Секция, Терминал, Конфигурационные Профили) следующие: 1) Каждый терминал принадлежит одной и только одной секции; 2) Каждый профиль принадлежит одной и только одной секции; 3) Каждый профиль сопоставлен N-му количеству терминалов (N=0..n); 4) Каждый терминал имеет профиль; 5) Если терминал принадлежит секции K, то профиль тоже должен принадлежать секции K. 6) Участок может быть пуст (временно, вырожденный случай); ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2009, 11:38 |
|
||
|
Непостоянная транзитивная взаимосвязь
|
|||
|---|---|---|---|
|
#18+
ChA, имхо, по-моему, схож с моим , тогда Вы и толкнули меня в сторону композитного FK... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2009, 14:19 |
|
||
|
Непостоянная транзитивная взаимосвязь
|
|||
|---|---|---|---|
|
#18+
NextManChA, имхо, по-моему, схож с моим , тогда Вы и толкнули меня в сторону композитного FK... Такие у меня тоже есть :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2009, 16:52 |
|
||
|
Непостоянная транзитивная взаимосвязь
|
|||
|---|---|---|---|
|
#18+
LelikkНикакой особенной предметной области нет."Варкалось. Хливкие шорьки. Пырялись по наве,..."© Ничего особенного, правда ведь ? :) LelikkБизнес-правила в отношении этиз 3-х сущностей (Секция, Терминал, Конфигурационные Профили) следующие: 1) Каждый терминал принадлежит одной и только одной секции; 2) Каждый профиль принадлежит одной и только одной секции; 3) Каждый профиль сопоставлен N-му количеству терминалов (N=0..n); 4) Каждый терминал имеет профиль; 5) Если терминал принадлежит секции K, то профиль тоже должен принадлежать секции K. 6) Участок может быть пуст (временно, вырожденный случай) Непонятна ситуация с 4 и 5 пунктами. Т.е., в чём разница между профилями терминала и секции ? Терминал всегда имеет профиль секции или может иметь собственный профиль, который не имеет никакого отношения к секции ? Или профиль секции добавляется к профилю терминала ? Или новому терминалу автоматически присваивается профиль секции, а дальше он может стать индивидуальным, присущим данному терминалу. В общем, чем отличается профиль секции от профиля терминала ? Пока создалось впечатление, что профиль терминала всегда соответствует профилю секции и для определения профиля терминала достаточно знать, к какой секции он относится. Соответственно, никакой прямой связи между терминалом и профилем не надо вообще. P.S. Участок(п.6) - синоним секции ?NextManтогда Вы и толкнули меня в сторону композитного FK..."...в пороки впал и гнусность возлюбил..."© ? :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.10.2009, 00:08 |
|
||
|
Непостоянная транзитивная взаимосвязь
|
|||
|---|---|---|---|
|
#18+
ChA...NextManтогда Вы и толкнули меня в сторону композитного FK..."...в пороки впал и гнусность возлюбил..."© ? :) В общем, Бармаглот таки изменил ТЗ, позволив обойтись без излишеств и непотребств. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.10.2009, 00:14 |
|
||
|
Непостоянная транзитивная взаимосвязь
|
|||
|---|---|---|---|
|
#18+
ChALelikkНикакой особенной предметной области нет."Варкалось. Хливкие шорьки. Пырялись по наве,..."© Ничего особенного, правда ведь ? :) LelikkБизнес-правила в отношении этиз 3-х сущностей (Секция, Терминал, Конфигурационные Профили) следующие: 1) Каждый терминал принадлежит одной и только одной секции; 2) Каждый профиль принадлежит одной и только одной секции; 3) Каждый профиль сопоставлен N-му количеству терминалов (N=0..n); 4) Каждый терминал имеет профиль; 5) Если терминал принадлежит секции K, то профиль тоже должен принадлежать секции K. 6) Участок может быть пуст (временно, вырожденный случай) Непонятна ситуация с 4 и 5 пунктами. Т.е., в чём разница между профилями терминала и секции ? Терминал всегда имеет профиль секции или может иметь собственный профиль, который не имеет никакого отношения к секции ? Или профиль секции добавляется к профилю терминала ? Или новому терминалу автоматически присваивается профиль секции, а дальше он может стать индивидуальным, присущим данному терминалу. В общем, чем отличается профиль секции от профиля терминала ? Пока создалось впечатление, что профиль терминала всегда соответствует профилю секции и для определения профиля терминала достаточно знать, к какой секции он относится. Соответственно, никакой прямой связи между терминалом и профилем не надо вообще. P.S. Участок(п.6) - синоним секции ?NextManтогда Вы и толкнули меня в сторону композитного FK..."...в пороки впал и гнусность возлюбил..."© ? :) 1) Участок - синоним секции; 2) Секции профилей НЕ имеют, они лишь содержат внутри профили терминалов; 3) Сопоставляются всегда терминалы и их профили; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.10.2009, 11:10 |
|
||
|
Непостоянная транзитивная взаимосвязь
|
|||
|---|---|---|---|
|
#18+
Lelikk2) Секции профилей НЕ имеют, они лишь содержат внутри профили терминаловСобственно, принадлежность профиля и подразумевалась. В общем, если правильно понял, то вырисовывается следующая картина: Код: plaintext Каждой секции соответсвует множество профилей(0,..., P s ) Каждому профилю соотвествует множество терминалов(0,..., T Ps ) Терминал обязательно имеет профиль Терминал обязательно принадлежит секции Профиль обязательно принадлежит секции Если всё обстоит именно так, то схема, предложенная NextMan, близка, но есть нюансы. Прилагается слегка поправленный вариант Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. В противном случае, если подразумевается полная независимость профиля с потенциальной возможностью принадлежать нескольким секциям одновременно, то было бы правильнее вообще всё переиграть иначе Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2009, 02:52 |
|
||
|
|

start [/forum/topic.php?fid=32&msg=36230597&tid=1543050]: |
0ms |
get settings: |
11ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
42ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
58ms |
get tp. blocked users: |
1ms |
| others: | 270ms |
| total: | 411ms |

| 0 / 0 |
