Хотя это правда, что вам просто не нужен столбец QuestionID
в CorrectAnswer
, поскольку он является избыточным, и следующая схема решит текущую проблему:
CREATE TABLE dbo.CorrectAnswer(
CorrectAnswerID INT IDENTITY(1,1) PRIMARY KEY,
AnswerID INT NOT NULL,
FOREIGN KEY(AnswerID) REFERENCES dbo.AnswerChoices(AnswerID)
ON DELETE CASCADE ON UPDATE CASCADE
);
Я предлагаю этот дизайн вместо:
CREATE TABLE dbo.Questions
(
QuestionID INT IDENTITY(1,1) PRIMARY KEY,
Question VARCHAR(MAX) DEFAULT NULL
);
CREATE TABLE dbo.Answers
(
AnswerID INT IDENTITY(1,1) PRIMARY KEY,
Answer VARCHAR(MAX) DEFAULT NULL,
QuestionID INT NOT NULL,
IsCorrectAnswer bit NOT NULL,
CONSTRAINT FK_Question FOREIGN KEY(QuestionID)
REFERENCES dbo.Questions(QuestionID)
ON DELETE CASCADE ON UPDATE CASCADE
);
Ограничение не может обеспечить правильность только одной строки для каждого вопроса, но вы можете применить это через триггер (изменение области действия для этого вопроса). Выполнение по крайней мере одной строки может быть немного сложнее (очень похоже на обеспечение того, что строка должна существовать в CorrectAnswer
в исходном проекте, потому что, когда вы можете это сделать?), Просто потому, что это будет означать, что у вас есть сначала вставить правильный ответ.
Возможно, вам также нужны некоторые метаданные для определения порядка выбора, появляющегося в тесте, особенно если вы намереваетесь вставить правильные / неправильные ответы в некотором предсказуемом порядке.