是否允許兩個表之間有兩種類型的關係?
一段時間以來,我一直在使用關係數據庫和無 sql 數據庫來回工作,我的問題可能是混合瞭如何解決問題的思維方式的結果。
因此,考慮一個簡單的多項選擇測驗場景,其中一個問題的答案數量未定義(這意味著每個問題的答案數量不是固定的。一個問題可能有兩種選擇,另一個可能有五個)。這個問題會有一個正確答案。因此,如果我們想在我剛剛寫的 SQL 術語之間進行初始翻譯,它將是這樣的:
Question Answer ===============| |========== Id | |Id ---------------|------<|---------- Title | |Body ---------------|-------|---------- CorrectAnswerId| |QuestionId
所以在我看來,一個問題可以有很多答案,而一個答案只能連結到一個問題 ->
Question
和之間的一對多關係Asnwer
。
Question
此外,每個問題都有一個且只有一個正確答案 ->和之間的一對一關係Asnwer
。我想問的是,這種設計可以接受嗎?如果不是,我可以採取什麼方法?
我可以做的一件事是為實體添加一個
IsCorrectAnswer
標誌。Answer
但是,它使更新問題的正確答案變得更加困難並且(在我看來)容易出錯。澄清我所說的“允許”
我希望數據盡可能標準化(我認為我的第一個解決方案不會)並且我也不希望有任何更新、插入和刪除異常(我認為第二個解決方案“可能”有)
這聽起來可能有點瘋狂,但正如 ypercube在評論中連結的答案中指出的那樣,最好將其視為**一個單獨的關係:**我們需要一個新的 table
Question_CorrectAnswer
,它的 PK 是QuestionID
。這意味著我們只需要更新一行來更改正確答案。
我們唯一的問題是,為了防止更新異常,即有人可以輸入 an
Answer
作為不同的正確的Question
,我們必須將Answer
的主鍵重新定義為 areAnswerID, 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 個問題是正確的。話雖這麼說,您可能想要有多項選擇題,對吧?必須更新事務中的多行並不是什麼大問題。
您的設計將使用任一選項進行足夠的標準化。