Как убрать связи многие ко многим
Перейти к содержимому

Как убрать связи многие ко многим

  • автор:

Следует ли избегать связь "многие-ко-многим"

Слышал, что отношение «многие-ко-многим» следует избегать и сводить его к «один-ко-многим». Правда ли это? И почему следует так делать?

melihovv's user avatar

Наверное имеется ввиду что, когда, например, у вас есть таблица статей и таблица тегов, то:

Неправильно будет добавить в таблицу статей дополнительные колонки для некоторого числа тегов вида ID тега 1 , ID тега 2 , ID тега 3

Правильно будет создать ещё одну таблицу вида ID связи — ID статьи — ID тега

Почему именно так легко увидеть попытавшись сделать поиск по тегам в том и другом случае.

Как убрать связи многие ко многим

Связь многие-ко-многим возможна только на уровне логической модели. При переходе к реляционной модели Data Modeler автоматически преобразовывает связь многие-ко-многим, добавляя новую таблицу и устанавливая две новые связи один-ко-многим от старой таблице к новой. Объект, который создается в результате такого преобразования связи, называют таблицей пересечения.

Можно сделать эту замену связи вручную, еще на уровне логической модели.

36. Удалите связь между сущностями Автор и Книга.

37. Создайте сущность КнигаАвтор (bookavtor) – см. 3.

38. Создайте идентифицирующую связь один-ко-многим : выберите инструмент New 1:N Identifying Relation , выберите мышью родительскую сущность Книга, выберите мышью дочернюю сущность КнигаАвтор .

39. Создайте идентифицирующую связь один-.ко-многим : выберите инструмент New 1:N Identifying Relation , выберите мышью родительскую сущность Автор, выберите мышью дочернюю сущность КнигаАвтор .

40. Удалите связь между сущностями Заказ и Книга.

41. Создайте сущность ПунктЗаказа (punkt) – см. 3.

42. Создайте идентифицирующую связь один-ко-многим : выберите инструмент New 1:N Identifying Relation , выберите мышью родительскую сущность Книга, выберите мышью дочернюю сущность ПунктЗаказа.

43. Создайте идентифицирующую связь один-ко-многим : выберите инструмент New 1:N Identifying Relation , выберите мышью родительскую сущность Заказ, выберите мышью дочернюю сущность ПунктЗаказа.

Логическая модель после замены связей многие-ко-многим должна быть как на рис. 13.

Как удалить все связи многие ко многим Entity FrameWork?

Planet_93

Попробуйте удалить поле, которое вы изменяете. Обновить базу. Потом добавить поле и обновить еще раз.

EntityFramefork бывает не очень корректно работает когда происходит изменение каких то полей, связей. Лучше удалять, а потом добавлять заново.

Также посмотрите таблицу миграций, возможно в ней идут конфликты. Можно попробовать по удалять оттуда записи и производить обновления после каждого удаления.

Если это не поможет, то просто удалите таблицу (все таблицы) и сделайте миграцию.

Если в БД важные данные, то со способом удаления записей из таблице миграций будьте аккуратней.

Устранение связи «многие-ко-многим»

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

На рис. 3.1.10 между таблицами «Преподаватель» и «Дисциплина» имеется связь типа «многие – ко — многим» — один преподаватель ведет много дисциплин, одну дисциплину ведут многие преподаватели.

Рис. 3.1.10. Устранение связи «многие-ко-многим»

Устранение таких связей выполняется по следующим правилам:

ÿ создается новая (так называемая вспомогательная) таблица;

ÿ между исходными и новой таблицами устанавливаются связи типа 1:М;

ÿ из модели удаляется связь М:М.

Имя вспомогательной таблицы часто образуется как сочетание имен исходных таблиц, между которыми была обнаружена связь М:М. В общем случае вспомогательные таблицы могут не иметь собственных атрибутов; если это так, то определенные для них связи становятся ключевыми.

Информационно-логическая модель базы данных «Занятость»

Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *