Sql-Server

是否允許兩個表之間有兩種類型的關係?

  • February 25, 2021

一段時間以來,我一直在使用關係數據庫和無 sql 數據庫來回工作,我的問題可能是混合瞭如何解決問題的思維方式的結果。

因此,考慮一個簡單的多項選擇測驗場景,其中一個問題的答案數量未定義(這意味著每個問題的答案數量不是固定的。一個問題可能有兩種選擇,另一個可能有五個)。這個問題會有一個正確答案。因此,如果我們想在我剛剛寫的 SQL 術語之間進行初始翻譯,它將是這樣的:

Question                Answer
===============|       |==========
Id             |       |Id
---------------|------<|----------
Title          |       |Body
---------------|-------|----------
CorrectAnswerId|       |QuestionId

所以在我看來,一個問題可以有很多答案,而一個答案只能連結到一個問題 ->Question和之間的一對多關係Asnwer

Question此外,每個問題都有一個且只有一個正確答案 ->和之間的一對一關係Asnwer

我想問的是,這種設計可以接受嗎?如果不是,我可以採取什麼方法?

我可以做的一件事是為實體添加一個IsCorrectAnswer標誌。Answer但是,它使更新問題的正確答案變得更加困難並且(在我看來)容易出錯。

澄清我所說的“允許”

我希望數據盡可能標準化(我認為我的第一個解決方案不會)並且我也不希望有任何更新、插入和刪除異常(我認為第二個解決方案“可能”有)

這聽起來可能有點瘋狂,但正如 ypercube在評論中連結的答案中指出的那樣,最好將其視為**一個單獨的關係:**我們需要一個新的 table Question_CorrectAnswer,它的 PK 是QuestionID

這意味著我們只需要更新一行來更改正確答案。

我們唯一的問題是,為了防止更新異常,即有人可以輸入 anAnswer作為不同的正確的Question,我們必須將Answer的主鍵重新定義為 are AnswerID, QuestionID,並將這兩列上的 FK 一起重新定義。

所以我們像這樣定義我們的表:(

請不要把它作為最好的寫法CREATE TABLE,例如,我省略了約束名稱)

CREATE TABLE Question (
   QuestionId int IDENTITY PRIMARY KEY,
   Title varchar(100) NOT NULL
)

CREATE TABLE Answer (
   AnswerId int IDENTITY,
   QuestionId int NOT NULL REFERENCES Question (QuestionID),
   Body varchar(1000) NOT NULL,
   PRIMARY KEY (AnswerID, QuestionID)
)

CREATE TABLE Question_CorrectAnswer (
   QuestionId int NOT NULL PRIMARY KEY,
   AnswerId int NOT NULL,
   FOREIGN KEY (AnswerId, QuestionID) REFERENCES Answer (AnswerID, QuestionID)
)

不過,它確實有需要額外連接的缺點。

如果將 CorrectAnswerId 添加到問題表中,則無需更新所有答案行,假設只有 1 個問題是正確的。話雖這麼說,您可能想要有多項選擇題,對吧?必須更新事務中的多行並不是什麼大問題。

您的設計將使用任一選項進行足夠的標準化。

引用自:https://dba.stackexchange.com/questions/285928