Каковы преимущества использования отдельной таблицы ролей-мостов над таблицей "все в одном"?

У меня есть бридж-стол book_person между столами book а также person обеспечить отношение многих ко многим. В этой таблице у меня также есть определения ролей, чтобы определить, какие роли (автор, редактор, иллюстратор, переводчик и т. Д.) Выполняет человек в определенной книге. Теперь я рассматриваю разделение ролей на отдельные таблицы ролей (например, book_author, book_translator так далее). Но я сомневаюсь, это хорошая идея или нет? Для профессионалов это делает БД более чистой, и одно простое преимущество, которое я вижу, это то, что загрузчик схемы DBIC обнаруживает такие простые таблицы-мосты и создает для меня методы доступа многие-ко-многим. Для минусов я вижу, что для агрегирования функций для ролей потребуется больше объединений.

Каковы преимущества использования отдельной таблицы ролей-мостов по сравнению с универсальной ролью-мостовой таблицей? А какие недостатки? Я пытаюсь обновить свои приложения, используя ORM (DBIx::Class), но пока не очень хорошо это знаю, поэтому соображения по этому поводу также действительно приветствуются.

2 ответа

Решение
create table book (
  id_book integer primary key,
  name_book text,
  author_book
);

create table person (
  id_person integer primary key,
  name_person text
);

create table book_person (
  id_person integer,
  id_book integer,
  role_person text,
  primary key (id_person, id_book)
);

Я думаю, что использование роли в таблице book_person является хорошим выбором, если один человек имеет ТОЛЬКО одну роль, потому что:

  1. Есть только несколько ролей, которые вы используете.
  2. Чтобы не засорять вашу БД, когда вы могли бы сделать это, если бы создали еще несколько таблиц, таких как book_author, book_translator.
  3. Вам не нужно использовать, как вы сказали, много присоединений.
  4. Роли в вашем случае просто атрибут, и если вы не храните дополнительную информацию о возможностях ролей, вам не следует создавать еще одну таблицу для хранения связывающего человека-роли. Вы уже держите это в book_person.

Вам нужно создать еще одну таблицу для роли, если у вас есть:

  1. Один человек имеет более чем одну роль.
  2. Вы держите некоторую дополнительную информацию о роли, как я сказал выше.

Я думаю, это все.

Учитывая, что человек может иметь несколько ролей для книги, я бы создал отдельную таблицу (скажем, book_person_role) с person-id/book-id в качестве внешнего ключа и идентификатора роли. Таким образом, вы получаете отношение "один ко многим" от book_person к book_person_role. Я бы не стал создавать таблицу для каждой роли; это будет означать изменение схемы при добавлении / удалении / изменении роли.

Другие вопросы по тегам