powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Внешние ключи и несколько дочерних таблиц при проектировании БД в MySQL Workbecnh
5 сообщений из 5, страница 1 из 1
Внешние ключи и несколько дочерних таблиц при проектировании БД в MySQL Workbecnh
    #38885713
jucus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Приветствую!

Работаю над проектирование небольшой БД и решил воспользоваться таким прекрасным инструментом как 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).

Сомнительные атрибуты выделены на приложенной диаграмме.

Вопрос, который меня мучает уже несколько часов - как будет более правильно?
...
Рейтинг: 0 / 0
Внешние ключи и несколько дочерних таблиц при проектировании БД в MySQL Workbecnh
    #38886037
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jucus,

ничего неправильного тут нет.
О решении "независимая сущность vs зависимая сущность" - тут лучше подходить буквально. если дочерняя сущность может существовать без родительской - делать неидентифицирующую связь. иначе - идентифицирующую.
...
Рейтинг: 0 / 0
Внешние ключи и несколько дочерних таблиц при проектировании БД в MySQL Workbecnh
    #38886331
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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;

понятно почему внешние ключи стали составными, ибо добавочный айдишник в таблице паспортов обычных не обязательно уникальный...нам главное чтобы пара этот айди+ ссылка на человека была уникальна... если мы гарантируем его уникальность, то в таблице загранпаспортов можно принципе пользоваться не составным ключом внешним... однако, в этом случае мы потеряем одну логическую цепочку.

если паспорт - человек ----идентифицирующая связь, загранпаспорт-паспорт ----идентифицирующая, ====отсюда следует, ясень пень, человек ---загранпаспорт тоже идентифицирующая связь, но изза упрощения с ключами мы её потеряли, вто время как при составном, зная запись загранпаспорта, мы сразу можеш найти нужного человека, без промежуточного шага поиска паспорта
...
Рейтинг: 0 / 0
Внешние ключи и несколько дочерних таблиц при проектировании БД в MySQL Workbecnh
    #38886473
jucus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alex564657498765453MasterZivjucus,

ничего неправильного тут нет.
.....
......
если паспорт - человек ----идентифицирующая связь, загранпаспорт-паспорт ----идентифицирующая, ====отсюда следует, ясень пень, человек ---загранпаспорт тоже идентифицирующая связь, но изза упрощения с ключами мы её потеряли, вто время как при составном, зная запись загранпаспорта, мы сразу можеш найти нужного человека, без промежуточного шага поиска паспорта
Спасибо за исчерпывающие ответы.
Надеюсь, теперь я все правильно понял и делаю вывод, что упрощение ключей допустимо, и имеет плюс:
1. Удаление избыточности данных и упрощение структуры.

Но с другой стороны мы теряем одну логическую связь со следующими последствиями:
1. Вероятность нарушения связанности данных.
2. Необходимость дополнительного запроса при некоторых выборках результатов.

P.S. Есть над чем подумать ...
...
Рейтинг: 0 / 0
Внешние ключи и несколько дочерних таблиц при проектировании БД в MySQL Workbecnh
    #39143822
sameuser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет. Пока разбирался с насущными задачами, возник вопрос, который я посчитал нужным не выносить в отдельную тему и задать тут.

Работаю в 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) у меня немного (лишь текущий проект), последнее время изучал больше теоретический материал... Поэтому могу задавать вопросы некорректно. Прошу учесть :)
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Внешние ключи и несколько дочерних таблиц при проектировании БД в MySQL Workbecnh
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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