|
|
|
Вопрос по идентифицирующей и неидентирующей связи
|
|||
|---|---|---|---|
|
#18+
Добрый день! Новичок в вопросах построения моделей БД, поэтому мои вопросы могут показаться "лузерскими". Тем не менее, прошу отнестись с пониманием. Прошелестел кучу информации относительно идентифицирующей и неидентифицирующей связях. Вот, так сказать, кратенько о том, что вынес: 1. Если связь идентифицирующая ( то есть, первичный ключ родительской таблицы мигрирует в первичный ключ дочерней таблицы). 2. Если связь неидентифицирующая, то первичный ключ родительской таблицы просто мигрирует в дочернюю, но в первичный ключ не входит. По этой теме не могу взять в толк (такое ощущение, что я просто не понимаю каких-то основополагающих вещей): 1. Зачем нам в первичный ключ ( при идентифицирующей связи) дочерней таблицы включать первичный ключ родительской? Какой в этом практический толк? В чем кроется суть? Почему мы не можем просто добавить первичный ключ родительской таблицы как NOT NULL, при этом не включая его в первичный ключ дочерней? В чем кроется разница? Может, это каким-то образом ускорит выборку данных? Повлияет на целостность БД, консистентность данных? Вот, к примеру, практический случай. Есть у нас ИС -- "телефонно-адресная книга". Все телефоны привязаны к какому-то конкретному адресу. Получаем идентифицирующую связь ( телефон (имеется ввиду городской) не может существовать без адреса). Практический смысл мне включать PK таблицы Адреса в PK таблицы Телефоны (в нашем случае, я так понимаю, в таблице Адреса получится составной первичный ключ -- из полей ID_адрес и из поля ID_телефон?). Просветите, плиз, ситуацию... А-то как-то никак в толк не возьму.) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.11.2012, 17:39 |
|
||
|
Вопрос по идентифицирующей и неидентирующей связи
|
|||
|---|---|---|---|
|
#18+
Вот другой пример - телефоны предприятия с расширениями типа телефон 777-7777 ext 4444. Расширения имеют смысл и уникальность только в контексте родительского основного номера. Связь между основным номером 777-7777 и полным номером 777-7777 ext 4444 будет идентифицирующей. 1. Полный телефонный номер должен быть уникальным, т.е. оба основной номер и расширение должны быть частями первичного ключа дочерней таблицы. Одно расширение не может быть правильным первичным ключем поскольку запрещает записи типа 888-8888 ext 4444 в комбинации с 777-7777 ext 4444. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.11.2012, 21:38 |
|
||
|
Вопрос по идентифицирующей и неидентирующей связи
|
|||
|---|---|---|---|
|
#18+
juventineДобрый день! Новичок в вопросах построения моделей БД, поэтому мои вопросы могут показаться "лузерскими". Тем не менее, прошу отнестись с пониманием. Прошелестел кучу информации относительно идентифицирующей и неидентифицирующей связях. Вот, так сказать, кратенько о том, что вынес:... Ничего Вы не прошелестели. А вынесли что-то частное и субъективное:) http://citforum.ru/database/case/glava2_4_2.shtml Важно, что эти термины никакого отношения к моделям данных не имеют. Они носят весьма частный характер. Проще рассматривать такой атрибут связи, как обязательность связи со стороны одного из связываемых Типов сущностей. А что касается "ключей", то приведенные Вами идеи относятся лишь к таким системам, в которых не поддерживается идентификация сущностей (например, это относится к весьма распространенным "реляционным системам). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.11.2012, 21:54 |
|
||
|
Вопрос по идентифицирующей и неидентирующей связи
|
|||
|---|---|---|---|
|
#18+
juventine, возможно, имеет значение деление сущностей на независимые и зависимые (могут быть другие назваеия: сильные, слабые и т.д.). Зависимые типа нуждаются в независмых, чтобы представлять информационное значение. Например, в плановом отделе есть договоры и этапы этих договоров. Сущность "Этап договора", без свойств Сущности "Договор", неизвестно как какому Договору относится и, скорее всего, имеет малую информационную ценность. И связь Договоров с этапами можно, по видимому, считать идентифицирующей в том смысле, что с помощью этой связи, через договор, этап нельзя перепутать с этапми другого договора. А вот сущность Подразделение, скорей всего тоже независимая как и договор. И их связи с этапми, не имеет, скорее всего, считать идентифицирующей: она мало поможе при идентификации, скорее всего . Первичные ключи часто считаются идентифицирующими. Потому, скорее всего, их использование в таких связях, как правило, уместно. Это улучшает семантичность модели. Производительность - это физические аспкты, влияние которых на логические не желательно, скорее всего. А на концептуальную МД, вроде, вообще не уместна: оная стремится абстрагироваться от компьютерной реализации в принципе. Т.е. в общем случае даже от типа СУБД: на этапе концептуального проектирования может быть в общем случае не известно будет ли это реляционная, иерархическая, объектно-ориентированная или другая СУБД. Тем более о производительности. На этом этапе хоть бы понять что за данные в БД должны быть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.11.2012, 21:55 |
|
||
|
Вопрос по идентифицирующей и неидентирующей связи
|
|||
|---|---|---|---|
|
#18+
juventine 1. Зачем нам в первичный ключ ( при идентифицирующей связи) дочерней таблицы включать первичный ключ родительской? Например чтобы не делать лишнего индекса. Если на этот первичный ключ нет ссылок, то это вполне имеет смысл. juventine Практический смысл мне включать PK таблицы Адреса в PK таблицы ТелефоныОдним из популярных запросов будет - дайте все телефоны указанного адреса. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2012, 06:45 |
|
||
|
Вопрос по идентифицирующей и неидентирующей связи
|
|||
|---|---|---|---|
|
#18+
Sergei.Agalakov, Хороший пример. Насколько понял автора, там скорее всего, больше проблема с есстественными и суррогатными ключами. В вашем примере - всё наглядно. А вот если в обе таблицы ввести суррогатный первичный ключ, то становится "неочевидно": 1. Телефоны - phones {pkey(id), vchar::number} 2. расширения - addings {pkey(id), fkey(phones.phone_id), vchar::addition} Мне кажется, что вопрос у автора как раз тут: нафига включать внешний ключ к таблице телефонов в первичный ключ таблицы расширений? То есть чем лучше такое: 2а. расширения - addings { pkey(phones.phone_id, id), vchar::addition} ? По мне, так "особой разницы нет", разве что первичные ключи часто выделены в движках в особое явление и по ним обработка идет таки "чуть быстрее"... или есть ещё нюансы? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2012, 06:49 |
|
||
|
Вопрос по идентифицирующей и неидентирующей связи
|
|||
|---|---|---|---|
|
#18+
Arhat109А вот если в обе таблицы ввести суррогатный первичный ключ, то становится "неочевидно": Возможно, вопрос навеян CASE средствами, которые зависимые сущности рисуют прямоугольниками, со скуругленными углами. Но для этого первичный ключь независимой входит в состав первичного в зависмой. Что характерно для естесвенных ключей. Для суррогатных не входит в первичный, как правило, а просто внешний ключ. На то он и суррогатный, что идентифицирует программные объекты, а не сущности реального мира. И потому включать их в первичные других может выглядеть удручающе в общем случае: одно из их преимуществ как раз и есть отсутсвие необходимости составных первичных ключей. И на диаграмме такое CASE средство рисует сущность как незавимую с суррогатами, хотя автор хотел как зависимую: лучше читаемость. Ну при юзании суррогатных не очевидно, наверное, завимая или нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2012, 09:10 |
|
||
|
Вопрос по идентифицирующей и неидентирующей связи
|
|||
|---|---|---|---|
|
#18+
vadiminfo, :) вывод: "не пользуйтесь такими CASE средствами" :) насколько понял, ключевые вопросы автора были эти: "Какой в этом практический толк? Может, это каким-то образом ускорит выборку данных? Повлияет на целостность БД, консистентность данных? " , а вовсе не про "CASE средства". :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2012, 10:19 |
|
||
|
Вопрос по идентифицирующей и неидентирующей связи
|
|||
|---|---|---|---|
|
#18+
Arhat109, P.S. я вижу только то, что можно встроенный первичный ключ зависимой сущности (2а) сделать существенно коротким: например однобайтовым, если максимальное количество записей, связанных с каждой отдельной первичной сущностью (таблицей) - невелико. В примере: внутренних телефонов у одного номера меньше 256, или у автора: городских телефонов по одному адресу меньше 256. Ну или слово... или как ишо. Другого "практического" выхлопа - не вижу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2012, 10:23 |
|
||
|
Вопрос по идентифицирующей и неидентирующей связи
|
|||
|---|---|---|---|
|
#18+
Arhat109:) вывод: "не пользуйтесь такими CASE средствами" :) Возможно, такой вывод преждевременный. Если нельзя понять зависмая или не зависмая, то, может, и на CASE средство пенять не стоит. Ну будут все выглядеть как независимые. Arhat109насколько понял, ключевые вопросы автора были эти: "Какой в этом практический толк? Может, это каким-то образом ускорит выборку данных? Повлияет на целостность БД, консистентность данных? " , а вовсе не про "CASE средства". :) Вообще-то он типа про идентифицирующие связи спрашивал. Это вообще ближе к ER модели. Она на концептуальном уровне: еще может быть и тип СУБД не выбран на этом этапе. Какая тут производительность? Сама же ER модель имеет значительно большее практическое значение чем производительность: неудачно спроектированную БД, возможено, сложно компенсировать программными ухищрениями. Или этапы с моделированием - это чисто пустое теоретизирование? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2012, 10:43 |
|
||
|
Вопрос по идентифицирующей и неидентирующей связи
|
|||
|---|---|---|---|
|
#18+
vadiminfo, Да, не, почему. (прямо по Задорнову) :) Всё что Вы написали, безусловно важно на этапе пострения модели. В т.ч. и использование средств автоматизирующих проектирование. Просто мне показалось что автора интересовал другой круг вопросов. Совсем другой. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2012, 11:25 |
|
||
|
Вопрос по идентифицирующей и неидентирующей связи
|
|||
|---|---|---|---|
|
#18+
Arhat109, возможно, и на другой. Но все же он явно упомянул идентифицирующие связи, и из связь с миграцией первичных ключей и вход их в другие первичные. И если его интересует другое, то он сможет, по крайней мере, предположить, что эти связи к этому другому, возможно, имеют слишком отдаленное отношение. Они как бы больше относятся к более важным вопросам в общем случае, чем это "совсем другое". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2012, 11:38 |
|
||
|
Вопрос по идентифицирующей и неидентирующей связи
|
|||
|---|---|---|---|
|
#18+
juventineПрошелестел кучу информации относительно идентифицирующей и неидентифицирующей связях. Вот, так сказать, кратенько о том, что вынес: Искренне сочувствую. Это пожалуй наиболее дурацкий момент в существующей теории. Понятие идентифицирующей связи имхо придумал сугубый теоретик просто "чтобы было красиво", никакого практического смысла в таком разделении нет. На практике гораздо удобнее и полезнее думать в терминах "есть атрибут", "есть связь (просто связь - без эпитетов)", "атрибут входит в первичный ключ", "атрибут входит во внешний ключ". То есть - делайте неидентифицирующие связи и не парьтесь; в тот момент, когда почувствуете желание включить атрибут внешнего ключа в первичный - обдумаете и может быть сделаете, вот и всё. Позволю себе сразу добавить выжимку по остальным "ярким моментам" теории применительно к транзакционным системам (то есть БД, рассчитанным на ввод и редактирование данных пользователями). Пункт первый: первичный ключ таблицы практически всегда должен быть простым (из одного атрибута). Единственное более-менее частое исключение - развязки многие ко многим; иногда нужно сделать таблицу развязки между двумя-тремя другими, и тогда как правило вполне подходит ключ из внешних ключей на эти таблицы. Второе: если на таблицу есть ссылки (то есть у неё есть дочерние), ключ тем более должен быть простым. Третье: ключ практически всегда должен быть суррогатным. По факту, если Вы примете за правило делать у любой таблицы простой суррогатный ключ, то будьте уверены, получившаяся система будет мало отличаться в этом смысле от наилучшей возможной. С ростом опыта Вы нащупаете редкие случаи, когда от такой практики можно или даже стоит отступить, а пока - лучше не делайте этого. Наконец, стоит упомянуть один особый случай - ромб. Представьте себе, что у нас есть таблица А, на неё ссылаются Б и В. Нам надо сделать таблицу Г, ссылающуюся как на Б, так и на В. В этом случае возможен следующий приём: у таблиц Б и В делается составной первичный ключ, включающий в себя ключ А. В Г, соответственно, внешние ключи, ссылающиеся на эту таблицу и использующие один и тот же атрибут a_id для значения ключа, мигрировавшего из А. Таким образом возможно элегантно реализовать бизнес-правило "Г должно ссылаться на Б и В, ссылающиеся на одну и ту же запись в А". Такая структура востребована, например, если А и Б - мастер и деталь (скажем, счёт и его позиции), а В и Г - другая мастер-деталь, порождённая первой (скажем, расходная накладная и её позиции). Для удобства работы при этом Б и В по-прежнему должны содержать поле суррогатного ключа (то есть их первичный ключ избыточен - из него можно исключить ключ А, и он всё равно останется ключом). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2012, 22:59 |
|
||
|
Вопрос по идентифицирующей и неидентирующей связи
|
|||
|---|---|---|---|
|
#18+
juventine, возможно, теории тут вообще никакой нет (нет, скорее всего, собсно теорем никаких с этим связанных). В лучшем случае это может быть в каких-нибудь стандартах. Стандарты у них, у бржуа либеральные: хотите пользуйтесть, хотите нет. Выбор альтернатив за проекировщиком. Это упоминается при описании ER. Оная испотльзуется на этапе концептуального проектирования (соглано методом от буржуа). Практичность, только если ER окажется выразительнее: представление предметной области может быть получше. Например, в общем случае Концептуальное проектирование и Логическое могут выполнять разные люди. Кроме того, концептуальная может быть использована для согласования с заказчиком информационных требований. Т.е. практичность, может быть, связана со снижениями рисков ухудьшения качества проектирования. Если БД простая, то ER, может быть, вообще не нужна: проектирование снизу или вообще как получится. Чисто РМД может хватить: ее достоинства как раз в простоте интерпритации данных и позволяют многим вообще ниче не знать про ER. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.11.2012, 08:59 |
|
||
|
|

start [/forum/topic.php?fid=32&fpage=43&tid=1541464]: |
0ms |
get settings: |
9ms |
get forum list: |
9ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
363ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
49ms |
get tp. blocked users: |
1ms |
| others: | 219ms |
| total: | 663ms |

| 0 / 0 |
