Из того, что вы говорите, ClassificationSystemId
является частью ключа для MovieClassification
, поскольку может быть только один (или ноль) MovieClassification
для данной системы для данного фильма.
Теперь есть три случая, когда таблица Classification
может измениться:
- Вы добавляете новую классификацию в систему.
- Вы удаляете существующую классификацию из системы.
- Вы меняете метаданные для классификации (в опубликованной схеме они не отображаются).
В первом случае примером может быть добавление нового жанра к существующей системе жанров. Это имеет смысл, что вам нужно реклассифицировать фильмы, которые относятся к новому жанру, поэтому модель справедлива.
Во втором случае примером может быть удаление жанра из существующей системы. Все еще имеет смысл, что вам нужно реклассифицировать фильмы, которые принадлежали старому жанру, поэтому модель все еще остается в силе.
В третьем случае вы можете изменить, например, название жанра. Имеет смысл, что фильмы, уже классифицированные как этот жанр, меняют название своего жанра. Модель все еще держит.
Из того, что я могу понять, правильная нормализация - это поместить ClassificationSystemId
в MovieClassification
и сделать его частью ключа MovieClassification
(и сделать ClassificationSystemId
частью ключа для Classification
строк в предоставленном схема):
-- Tables Movie, ClassificationSystem not included for brevity
CREATE TABLE Classification
(
ClassificationId INT,
ClassificationSystemId INT,
PRIMARY KEY(ClassificationId, ClassificationSystemId),
FOREIGN KEY(ClassificationSystemId) REFERENCES ClassificationSystem(ClassificationSystemId)
);
CREATE TABLE MovieClassification
(
ClassificationId INT,
ClassificationSystemId INT,
MovieId INT,
Advice NVARCHAR(MAX),
PRIMARY KEY(ClassificationId, ClassificationSystemId, MovieId),
FOREIGN KEY(ClassificationId, ClassificationSystemId) REFERENCES Classification(ClassificationId, ClassificationSystemId),
FOREIGN KEY(MovieId) REFERENCES Movie(MovieId),
UNIQUE(ClassificationSystemId, MovieId)
);