Basierend auf dem, was Sie gesagt haben, würde ich das folgende allgemeine Schema verwenden:
CREATE TABLE [dbo].[PollQuestion]
(
[PollQuestionId] INT NOT NULL PRIMARY KEY IDENTITY,
[QuestionText] NVARCHAR(150) NOT NULL, -- Some reasonable character limit
[Created] DATETIME2(2) NOT NULL DEFAULT SYSUTCDATETIME(),
[Archived] DATETIME2(2) NULL, -- Remove this if you don't need to hide questions
)
CREATE TABLE [dbo].[PollOption]
(
[PollOptionId] INT NOT NULL PRIMARY KEY IDENTITY,
[PollQuestionId] INT NOT NULL, -- Link to the question here because options aren't shared across questions
[OptionText] NVARCHAR(50) NOT NULL, -- Some reasonable character limit
[Created] DATETIME2(2) NOT NULL DEFAULT SYSUTCDATETIME(),
[Archived] DATETIME2(2) NULL -- Remove this if you don't need to hide options
CONSTRAINT [FK_PollOption_PollQuestionId_to_PollQuestion_PollQuestionId] FOREIGN KEY ([PollQuestionId]) REFERENCES [dbo].[PollQuestion]([PollQuestionId])
)
CREATE TABLE [dbo].[PollResponse]
(
[PollResponseId] INT NOT NULL PRIMARY KEY IDENTITY,
[PollOptionId] INT NOT NULL,
[UserId] INT NOT NULL,
[Created] DATETIME2(2) NOT NULL DEFAULT SYSUTCDATETIME(),
[Archived] DATETIME2(2) NULL, -- Remove this if you don't need to hide answers
CONSTRAINT [FK_PollResponse_PollOptionId_to_PollOption_PollOptionId] FOREIGN KEY ([PollOptionId]) REFERENCES [dbo].[PollOption]([PollOptionId]),
CONSTRAINT [FK_PollResponse_UserId_to_User_UserId] FOREIGN KEY ([UserId]) REFERENCES [dbo].[User]([UserId])
)
Es ist Ihnen eigentlich egal, ob die Antwort eine Zahl, ein Datum, ein Wort usw. ist, da die Daten eine Antwort auf eine Frage sind, die Sie nicht direkt bearbeiten müssen. Darüber hinaus haben die Daten nur im Zusammenhang mit der Frage eine Bedeutung. Als solches ist nvarchar der vielseitigste vom Menschen lesbare Mechanismus zum Speichern der Daten.
Die Frage und die möglichen Antworten werden vom ersten Benutzer gesammelt und in die Tabellen PollQuestion und PollOption eingefügt. Der zweite Benutzer, der die Fragen beantwortet, würde aus einer Liste von Antworten auswählen (wahr / falsch = Liste von 2). Sie können die PollQuestion-Tabelle auch erweitern, um gegebenenfalls die Benutzer-ID des Erstellers einzuschließen, um die von ihnen erstellten Fragen zu verfolgen.
Auf Ihrer Benutzeroberfläche kann die vom Benutzer ausgewählte Antwort an den PollOptionId-Wert gebunden werden. Zusammen mit der PollQuestionId können Sie schnell überprüfen, ob die Antwort für die Frage gültig ist. Ihre Antwort, falls gültig, wird in die PollResponse-Tabelle eingetragen.
Abhängig von den Details Ihres Anwendungsfalls gibt es einige potenzielle Probleme. Wenn der erste Benutzer eine mathematische Frage verwenden möchte und Sie nicht mehrere mögliche Antworten anbieten möchten. Eine andere Situation ist, wenn die vom Erstbenutzer bereitgestellten Optionen nicht die einzigen Optionen sind, die der zweite Benutzer auswählen kann. Sie können dieses Schema wie folgt überarbeiten, um diese zusätzlichen Anwendungsfälle zu unterstützen.
CREATE TABLE [dbo].[PollResponse]
(
[PollResponseId] INT NOT NULL PRIMARY KEY IDENTITY,
[PollOptionId] INT NULL,
[PollQuestionId] INT NOT NULL,
[UserId] INT NOT NULL,
[AlternateResponse] NVARCHAR(50) NULL, -- Some reasonable character limit
[Created] DATETIME2(2) NOT NULL DEFAULT SYSUTCDATETIME(),
[Archived] DATETIME2(2) NULL, -- Remove this if you don't need to hide answers
CONSTRAINT [FK_PollResponse_PollOptionId_to_PollOption_PollOptionId] FOREIGN KEY ([PollOptionId]) REFERENCES [dbo].[PollOption]([PollOptionId]),
CONSTRAINT [FK_PollResponse_UserId_to_User_UserId] FOREIGN KEY ([UserId]) REFERENCES [dbo].[User]([UserId])
)
Ich würde wahrscheinlich auch eine Prüfbeschränkung hinzufügen, um sicherzustellen, dass entweder eine Option oder eine alternative Antwort bereitgestellt wird, aber nicht beide (Option und alternative Antwort), abhängig von Ihren Anforderungen.
Bearbeiten: Datentyp für AlternateResponse kommunizieren.
In einer perfekten Welt könnten wir das Konzept der Generika verwenden , um verschiedene Datentypen für die AlternateReponse zu verarbeiten. Leider leben wir nicht in einer perfekten Welt. Der beste Kompromiss, den ich mir vorstellen kann, besteht darin, anzugeben, wie der AlternateResponse-Datentyp in der PollQuestion-Tabelle aussehen soll, und die AlternateReponse als nvarchar in der Datenbank zu speichern. Unten finden Sie das aktualisierte Fragenschema und die neue Datentypentabelle:
CREATE TABLE [dbo].[PollQuestion]
(
[PollQuestionId] INT NOT NULL PRIMARY KEY IDENTITY,
[QuestionText] NVARCHAR(150) NOT NULL, -- Some reasonable character limit
[QuestionDataTypeId] INT NOT NULL,
[Created] DATETIME2(2) NOT NULL DEFAULT SYSUTCDATETIME(),
[Archived] DATETIME2(2) NULL, -- Remove this if you don't need to hide questions
-- Insert FK here for QuestionDataTypeId
)
CREATE TABLE [dbo].[QuestionDataType]
(
[QuestionDataTypeId] INT NOT NULL PRIMARY KEY IDENTITY,
[Description] NVARCHAR(50) NOT NULL, -- Some reasonable character limit
)
Sie können alle verfügbaren Datentypen für Fragenersteller auflisten, indem Sie aus dieser QuestionDataType-Tabelle auswählen. Ihre Benutzeroberfläche kann auf die QuestionDataTypeId verweisen, um das richtige Format für das alternative Antwortfeld auszuwählen. Sie sind nicht auf TSQL-Datentypen beschränkt, daher kann "Telefonnummer" ein Datentyp sein und Sie erhalten eine entsprechende Formatierung / Maskierung auf der Benutzeroberfläche. Bei Bedarf können Sie Ihre Daten auch über eine einfache case-Anweisung in die entsprechenden Typen umwandeln, um die alternativen Antworten in beliebiger Weise zu verarbeiten (auswählen, validieren usw.).