У меня есть следующие таблицы (для краткости я удалил ограничения и несвязанные столбцы) :
CREATE TABLE user (
user_id INT,
user_name VARCHAR
);
CREATE TABLE book (
book_id INT
);
CREATE TABLE book_author (
book_author_id INT,
book_id INT,
author_name VARCHAR
);
CREATE TABLE book_author_user_match (
book_author_id INT,
user_id INT
)
В таблице book_author_user_match
хранятся совпадения потенциалов пользователя с его книгой , который определяется путем поиска авторов и поиска подходящих имен. Пользователь должен быть сопоставлен с книгой только один раз, поэтому, если несколько авторов соответствуют одному и тому же c пользователю, я хочу сохранить только одну запись и отправить только одно уведомление этому пользователю для данной книги.
Вот часть, на которой я застрял. Достаточно просто добавить столбец book_id
и уникальное ограничение на (book_id, user_id)
. Однако я не хочу добавлять столбец book_id
в таблицу, поскольку таблицу book_author
можно объединить в столбец book_author_id
, чтобы найти book_id
. Другими словами, наличие в таблице столбцов book_author_id
и book_id
приводит к нормализации данных.
Я вижу только следующие варианты:
- добавить
book_id
и просто жить с ненормализованными данными - не имеют уникального ограничения и вместо этого обеспечивают один
user_id
на книгу на уровне кода
Ни один из этих варианты кажутся мне "правильными". У кого-нибудь есть какие-либо предложения относительно того, как я могу обеспечить соответствие одного пользователя для каждой книги, не отменяя нормализацию данных, или это ситуация, в которой нормально иметь денормализованные данные?
Я понимаю, что это часть вопрос само собой разумеющийся, но я в основном ищу альтернативы, о которых я не думал