Каковы преимущества использования отдельной таблицы ролей-мостов над таблицей "все в одном"?
У меня есть бридж-стол 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 является хорошим выбором, если один человек имеет ТОЛЬКО одну роль, потому что:
- Есть только несколько ролей, которые вы используете.
- Чтобы не засорять вашу БД, когда вы могли бы сделать это, если бы создали еще несколько таблиц, таких как book_author, book_translator.
- Вам не нужно использовать, как вы сказали, много присоединений.
- Роли в вашем случае просто атрибут, и если вы не храните дополнительную информацию о возможностях ролей, вам не следует создавать еще одну таблицу для хранения связывающего человека-роли. Вы уже держите это в book_person.
Вам нужно создать еще одну таблицу для роли, если у вас есть:
- Один человек имеет более чем одну роль.
- Вы держите некоторую дополнительную информацию о роли, как я сказал выше.
Я думаю, это все.
Учитывая, что человек может иметь несколько ролей для книги, я бы создал отдельную таблицу (скажем, book_person_role) с person-id/book-id в качестве внешнего ключа и идентификатора роли. Таким образом, вы получаете отношение "один ко многим" от book_person к book_person_role. Я бы не стал создавать таблицу для каждой роли; это будет означать изменение схемы при добавлении / удалении / изменении роли.