2013-08-30 23 views
5

Ho due tabelle come nell'istantanea sottostante.Come modificare questo rapporto molti a uno con uno a uno?

[Diagramma] [1]

Scenario: Una domanda deve avere una sola risposta corretta, ma può avere molti (3 nel mio caso) risposte sbagliate (come un quiz).

Problema:

Questions tavolo ha più risposte nella tabella Answers, ma solo uno risposta corretta. La risposta corretta è la AnswerID nella tabella Questions ed è correlata alla colonna AnswerID nella tabella Answer. Ma si presenta come una relazione Molti a Uno (vedere i campi in grassetto).

Ho applicato un vincolo UNIQUE a AnswerID nella tabella delle domande, ma mostra comunque una relazione molti a uno. Cosa posso fare in modo che ogni voce di colonna ID risposta sia collegata a un ID risposta singolo nella tabella delle domande? o è ok così com'è?

Grazie

DOMANDE TABELLA:

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 

RISPOSTE TABELLA:

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

Perché non aggiungere semplicemente un flag (RigtAnswer) nella tabella delle risposte? Questo ti salverà dai controlli extra (la risposta giusta non è nella lista delle possibili risposte ...) –

+0

Mostraci anche i tuoi script FOREING KEY. –

+0

@MauricioGracia Ho aggiunto una schermata da studio di gestione SQL –

risposta

4

Un altro approccio:

  1. goccia il QuestionID dal vostro tavolo Answers.
  2. Lascia cadere la colonna AnswerID dalla tabella Questions.
  3. creare una nuova tabella, QuestionAnswer (o qualcosa di più meaninful, come Exam, Test, etc.), che ha un QuestionID, un AnswerID, e una bandiera IsCorrect.
  4. Mappa tutti Answers al loro Questions e contrassegnare quale è corretto.

Ora è possibile riutilizzare le risposte anche per altre domande, e ogni domanda e risposta sempre esiste solo una volta. Può anche essere utile se si desidera aggiungere ulteriori metadati sulle combinazioni di domande.Ad esempio:

  1. A Sequence colonna per controllare l'ordine di visualizzazione delle risposte.
  2. Una colonna PointValue per aiutare a produrre un punteggio finale o un voto.
+0

Grazie. Mi piace questo approccio migliore. È riutilizzabile e mi sembra più "normalizzato". –

+0

Questo approccio non apporta alcun vantaggio all'approccio "Aggiungi [bool isCorrect] to Answers" (che * anche * consente di avere più risposte giuste). Anche questo approccio rende dolorosa l'eliminazione delle Risposte (non si può mai essere sicuri di poter cancellare una risposta in modo sicuro, perché un'altra domanda non ancora impegnata inserita da un altro utente potrebbe fare riferimento alla risposta che si sta per eliminare), non a menziona l'interfaccia utente complicata per abilitare il riutilizzo di Answers. La conversione di relazioni logicamente di proprietà in proprietà esclusiva rende la tua vita più difficile, non più facile. –

4

Non credo che si desidera un AnswerID sulla vostra tavola Questions. È possibile aggiungere IsCorrect alla tabella delle risposte, quindi avere un vincolo univoco tra QuestionID e IsCorrect, quando è IsCorrect è vero.

+0

Vero, o se non vuoi duplicare le risposte nella tua tabella delle risposte, puoi aggiungere un 'CorrectAnswerID' alla tabella' Domande'. – Khan

+0

Ciò impedisce anche l'errore di avere una risposta corretta al di fuori dell'intervallo di tutte le risposte, che agisce come un vincolo e rende il modello coerente anche a livello di database. –

+0

@Reimius Non è vero se si crea un indice filtrato e lo si rende univoco. –

1

Dovrebbe essere OK così com'è.

Per ottenere tutte le risposte potenziali, è necessario aderire su Questions.QuestionID = Answers.QuestionID, per ottenere l'anser corretto univoco, anziché partecipare a Questions.AnswerID = Answers.AnswerID.

1

due opzioni

  1. Crea colonna di chiave esterna con la unico e non NULL vincoli dalle DOMANDE tabella che fa riferimento a un unico, non colonna NULL nel RISPOSTE tavolo . Questo crea una relazione 1: (0 | 1).

  2. rimuovere la relazione grassetto e aggiungere una colonna IS_CORRECT_ANSWER al vostro tavolo risposte per determinare quale risposta è corretta

Per maggiori dettagli vedi 1:1 Foreign Key Constraints

0

tabella risposta impostato answerID PK e FK to Questions (QuestionId)