2013-08-30 58 views
5

我有兩張表,如下面的快照。如何將這種多對一的關係改變爲一對一的關係?

[圖表] [1]

情景: 一個問題,應該只有一個正確答案,但可以(在我的情況3)有很多錯誤的答案(如智力競賽節目)。

問題:

Questions表已在Answers表中的多個答案,但只有一個正確答案。正確的答案是Questions表中的AnswerID表,它與Answer表中的AnswerID列有關。但它顯示爲多對一關係(請參閱粗體字段)。

我對問題表中的AnswerID應用了UNIQUE約束,但它仍然顯示了多對一的關係。我可以做什麼,以便每個AnswerID列條目都鏈接到Question表中的單個AnswerID?或者這是好的,因爲它是?

謝謝

問題表:

CREATE TABLE [dbo].[Questions](
     [QuestionID] [int] NOT NULL, 
     [QuestionText] [nvarchar](max) NOT NULL, 
     [AnswerID] [int] UNIQUE NOT NULL, 
     [ImageLocation] [ntext] NULL, 
    CONSTRAINT [PK_Questions_1] PRIMARY KEY CLUSTERED 

解答表:

CREATE TABLE [dbo].[Answers](
    [AnswerID] [int] NOT NULL, 
    [AnswerText] [nchar](50) NOT NULL, 
    [QuestionID] [int] NOT NULL, 
CONSTRAINT [PK_Answers] PRIMARY KEY CLUSTERED 
+0

爲什麼不簡單地在你的答案表中添加一個標誌(RigtAnswer)?這將爲您節省額外支票(正確的答案不在可能的答案列表中......) –

+0

請向我們展示您的FOREING KEY腳本。 –

+0

@MauricioGracia我添加了一個來自SQL管理工作室的屏幕截圖 –

回答

4

另一種方法:

  1. QuestionIDAnswers表。
  2. Questions表中刪除AnswerID列。
  3. 創建新表,QuestionAnswer(或東西更有實際意義,比如ExamTest等),其中有一個QuestionID,一個AnswerIDIsCorrect標誌。
  4. 將全部Answers映射到它們的Questions,並標記哪一個是正確的。

現在,您可以重新使用了其他問題的答案爲好,每一個問題和回答永遠只存在一次。如果您想添加有關問題答案組合的其他元數據,這也可能很有用。例如:

  1. A Sequence列控制答案出現的順序。
  2. A PointValue專欄幫助產生最終得分或等級。
+0

謝謝。我更喜歡這種方法。它的可重用性和感覺更「正常化」給我。 –

+0

這種方法沒有增加「將[布爾isCorrect]添加到答案」方法(該方法*也使*有多個正確的答案)的好處。此外,這種方法會使刪除答案成爲一種痛苦(如果您可以安全地刪除答案,則可能無法確定,因爲另一個用戶輸入的另一個尚未提交的問題可能引用了您即將刪除的答案),而不是提到複雜的用戶界面,以便重新使用Answers。將邏輯上擁有的關係轉換爲無主的關係只會讓你的生活變得更難,而不是更容易。 –

4

您是否想在Questions表中AnswerID我不認爲。您可以將IsCorrect添加到答案表中,然後在QuestionIDIsCorrect之間有一個唯一約束,當IsCorrect爲真時。

+0

是的,或者如果你不想在你的答案表中有重複的答案,你可以在'Questions'表中添加一個CorrectAnswerID。 – Khan

+0

這也可以避免在所有答案的範圍之外擁有正確的AnswerId的錯誤,該錯誤充當約束,並且即使在數據庫級別也使模型保持一致。 –

+0

@Reimius如果您創建一個已過濾的索引並使其唯一,則不成立。 –

1

它應該可以。

要獲得所有可能的答案,請加入Questions.QuestionID = Answers.QuestionID,以獲取唯一正確的anser,而不是加入到Questions.AnswerID = Answers.AnswerID。

1

兩個選項

  1. 創建與惟一外鍵列,然後從質詢表引用UNIQUE,NOT NULL列NOT NULL約束真題答案表。這會創建1:(0 | 1)關係。

  2. 取出粗體關係和IS_CORRECT_ANSWER列添加到你的答案表以確定哪個答案是正確的

欲瞭解更多詳情,請參閱 1:1 Foreign Key Constraints

0

回答表設置AnswerId PK和FK問題(問題Id)