|
|
|
Внешние ключи и несколько дочерних таблиц при проектировании БД в MySQL Workbecnh
|
|||
|---|---|---|---|
|
#18+
Приветствую! Работаю над проектирование небольшой БД и решил воспользоваться таким прекрасным инструментом как MySQL Workbench, но раньше не сталкивался со связями. Я понимаю, что при идентифицирующей связи первичный ключ родительской таблицы A (id_a) мигрирует в первичный ключ дочерней таблицы B (id_b, id_a). Но тот факт, что создание еще одной дочерней таблицы C от таблицы B , вызывает миграцию составного первичного ключа таблицы B в таблицу C (id_c, id_b, id_a), стало для меня совершенным сюрпризом. Я понимаю, что логически это верно, но я никогда не встречался с этим на практике. Чисто практический опыт подсказывает, что первичный ключ таблицы C должен быть (id_c, id_b). Сомнительные атрибуты выделены на приложенной диаграмме. Вопрос, который меня мучает уже несколько часов - как будет более правильно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.02.2015, 18:28:56 |
|
||
|
Внешние ключи и несколько дочерних таблиц при проектировании БД в MySQL Workbecnh
|
|||
|---|---|---|---|
|
#18+
jucus, ничего неправильного тут нет. О решении "независимая сущность vs зависимая сущность" - тут лучше подходить буквально. если дочерняя сущность может существовать без родительской - делать неидентифицирующую связь. иначе - идентифицирующую. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.02.2015, 17:00:36 |
|
||
|
Внешние ключи и несколько дочерних таблиц при проектировании БД в MySQL Workbecnh
|
|||
|---|---|---|---|
|
#18+
MasterZivjucus, ничего неправильного тут нет. О решении "независимая сущность vs зависимая сущность" - тут лучше подходить буквально. если дочерняя сущность может существовать без родительской - делать неидентифицирующую связь. иначе - идентифицирующую. поддерживаю, идентифицирующая связь, это означает что связь идентифицирует (или связана с идентификацией самой записи). запись идентифицируется первичным ключом. идентифицирующая запись, должна быть в составе первичного ключа, тем самым становиться не возможным сделать запись без связи. вообще в твоём случае, можно подойти и так A - (aid, ...) PK = a_id; B- (as_aid, ...) PK = as_aid;FK = as_aid; C-(as_bs_aid,....) PK = as_bs_aid;FK = as_bs_aid; тем самым стаёт не возможным создать запись в В без привязки её к таблице А. например A - humans B - passports C - foreignpassports считаем что архив паспортов не наша текущая проблема. если же паспорта не действительные наша рпоблема, тогда да, в таблицах обоих паспортов ещо одно поле айдишник, которое в составе первичного ключа и получится B(bid,as_aid,....) PK = bid,as_aid; FK = as_aid C(c_id,bs_bid,as_aid), PK = c_id,bs_bid,as_aid; FK = bs_bid,as_aid; понятно почему внешние ключи стали составными, ибо добавочный айдишник в таблице паспортов обычных не обязательно уникальный...нам главное чтобы пара этот айди+ ссылка на человека была уникальна... если мы гарантируем его уникальность, то в таблице загранпаспортов можно принципе пользоваться не составным ключом внешним... однако, в этом случае мы потеряем одну логическую цепочку. если паспорт - человек ----идентифицирующая связь, загранпаспорт-паспорт ----идентифицирующая, ====отсюда следует, ясень пень, человек ---загранпаспорт тоже идентифицирующая связь, но изза упрощения с ключами мы её потеряли, вто время как при составном, зная запись загранпаспорта, мы сразу можеш найти нужного человека, без промежуточного шага поиска паспорта ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.02.2015, 11:53:02 |
|
||
|
Внешние ключи и несколько дочерних таблиц при проектировании БД в MySQL Workbecnh
|
|||
|---|---|---|---|
|
#18+
alex564657498765453MasterZivjucus, ничего неправильного тут нет. ..... ...... если паспорт - человек ----идентифицирующая связь, загранпаспорт-паспорт ----идентифицирующая, ====отсюда следует, ясень пень, человек ---загранпаспорт тоже идентифицирующая связь, но изза упрощения с ключами мы её потеряли, вто время как при составном, зная запись загранпаспорта, мы сразу можеш найти нужного человека, без промежуточного шага поиска паспорта Спасибо за исчерпывающие ответы. Надеюсь, теперь я все правильно понял и делаю вывод, что упрощение ключей допустимо, и имеет плюс: 1. Удаление избыточности данных и упрощение структуры. Но с другой стороны мы теряем одну логическую связь со следующими последствиями: 1. Вероятность нарушения связанности данных. 2. Необходимость дополнительного запроса при некоторых выборках результатов. P.S. Есть над чем подумать ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.02.2015, 16:39:23 |
|
||
|
Внешние ключи и несколько дочерних таблиц при проектировании БД в MySQL Workbecnh
|
|||
|---|---|---|---|
|
#18+
Привет. Пока разбирался с насущными задачами, возник вопрос, который я посчитал нужным не выносить в отдельную тему и задать тут. Работаю в mysql workbench.. Зациклился на таком явлении, как свойство "mandatory", устанавливающееся для связей. Скриншот, который хочу рассмотреть: http://s8.hostingkartinok.com/uploads/images/2016/01/5451b71470d43284bca59f9c14ec3170.jpg Вкратце: центральный объект - ec_item (товар). С ним связаны таблицы ec_item_image и ec_item_status предполагается, что товар (ec_item) может существовать и без картинок (ec_item_image) также предполагается, что товар (ec_item) должен обладать всегда каким-либо статусом (из таблицы ec_item_status) Вопрос: снятый чекбокс со свойства "mandatory" в таблице ec_item_image будет способствовать тому, что при создании новой записи (кортеж это вроде как называется, но могу и ошибаться) в ec_item СУБД не будет искать связи, проверять или какие-либо действия выполнять в отношении таблицы ec_item_image? Вопрос: Для таблицы ec_item_status также построена идентифицирующая связь с таблицей ec_item, но здесь свойство "mandatory" указано явно для обоих сторон (таблиц). В этом случае при попытке создать запись в ec_item и не задав в SQL-запросе значение для ec_item_status.status_id СУБД будет ругаться и не даст выполнить такой запрос? Вопрос: вышеперечисленные опции вносятся в структуру создаваемой БД, если только не выбрать skip on sql generation? Эти опции содержатся в SQL-запросе, который можно экспортировать из MYSQL workbench для последующего импорта в рабочую БД? Верно ли я понимаю эти нюансы? :) Вопрос: Как я понимаю, описанные выше ограничения и проверки можно делать и на php, но если стоит цель обеспечить целостность БД \ платежные операции, то лучше полагаться не на пхп, а на структуру БД, прописав там все нужные ограничения? Практики (SQL\PHP) у меня немного (лишь текущий проект), последнее время изучал больше теоретический материал... Поэтому могу задавать вопросы некорректно. Прошу учесть :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.01.2016, 16:56:35 |
|
||
|
|

start [/forum/topic.php?fid=47&msg=38886473&tid=1832298]: |
0ms |
get settings: |
5ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
171ms |
get topic data: |
6ms |
get forum data: |
2ms |
get page messages: |
29ms |
get tp. blocked users: |
1ms |
| others: | 190ms |
| total: | 418ms |

| 0 / 0 |
