Следует ли избегать связь "многие-ко-многим"
Слышал, что отношение «многие-ко-многим» следует избегать и сводить его к «один-ко-многим». Правда ли это? И почему следует так делать?
Наверное имеется ввиду что, когда, например, у вас есть таблица статей и таблица тегов, то:
Неправильно будет добавить в таблицу статей дополнительные колонки для некоторого числа тегов вида 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?
Попробуйте удалить поле, которое вы изменяете. Обновить базу. Потом добавить поле и обновить еще раз.
EntityFramefork бывает не очень корректно работает когда происходит изменение каких то полей, связей. Лучше удалять, а потом добавлять заново.
Также посмотрите таблицу миграций, возможно в ней идут конфликты. Можно попробовать по удалять оттуда записи и производить обновления после каждого удаления.
Если это не поможет, то просто удалите таблицу (все таблицы) и сделайте миграцию.
Если в БД важные данные, то со способом удаления записей из таблице миграций будьте аккуратней.
Устранение связи «многие-ко-многим»
Кроме нормализации отношений, при построении информационно-логической модели необходимо устранить связи типа «многие-ко-многим», так как эти связи в компьютерных базах данных напрямую не устанавливаются.
На рис. 3.1.10 между таблицами «Преподаватель» и «Дисциплина» имеется связь типа «многие – ко — многим» — один преподаватель ведет много дисциплин, одну дисциплину ведут многие преподаватели.
Рис. 3.1.10. Устранение связи «многие-ко-многим»
Устранение таких связей выполняется по следующим правилам:
ÿ создается новая (так называемая вспомогательная) таблица;
ÿ между исходными и новой таблицами устанавливаются связи типа 1:М;
ÿ из модели удаляется связь М:М.
Имя вспомогательной таблицы часто образуется как сочетание имен исходных таблиц, между которыми была обнаружена связь М:М. В общем случае вспомогательные таблицы могут не иметь собственных атрибутов; если это так, то определенные для них связи становятся ключевыми.
Информационно-логическая модель базы данных «Занятость»
Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями: