당신이 말한 것을 바탕으로 다음과 같은 일반적인 스키마를 사용합니다.
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])
)
데이터가 직접 조작해야하는 것이 아니라 질문에 대한 답변이기 때문에 답변이 숫자, 날짜, 단어 등이면 실제로 신경 쓰지 않아도됩니다. 또한 데이터는 질문과 관련하여 의미가 있습니다. 이러한 nvarchar는 데이터를 저장하기위한 가장 다재다능한 사람이 읽을 수있는 메커니즘입니다.
질문과 잠재적 인 답변은 첫 번째 사용자로부터 수집되어 PollQuestion 및 PollOption 테이블에 삽입됩니다. 질문에 대답하는 두 번째 사용자는 답변 목록 (참 / 거짓 = 2 목록)에서 선택합니다. PollQuestion 테이블을 확장하여 생성자의 질문을 추적하기 위해 필요한 경우 작성자의 사용자 ID를 포함시킬 수도 있습니다.
UI에서 사용자가 선택한 답변은 PollOptionId 값에 연결될 수 있습니다. PollQuestionId와 함께 질문에 대한 답변이 신속하게 유효한지 확인할 수 있습니다. 유효한 경우 응답은 PollResponse 테이블에 입력됩니다.
사용 사례에 따라 몇 가지 잠재적 인 문제가 있습니다. 첫 번째 사용자가 수학 질문을 사용하고 여러 가능한 답변을 제공하지 않으려는 경우. 또 다른 상황은 초기 사용자가 제공하는 옵션이 두 번째 사용자가 선택할 수있는 유일한 옵션이 아닌 경우입니다. 이러한 추가 사용 사례를 지원하기 위해이 스키마를 다음과 같이 재 작업 할 수 있습니다.
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])
)
또한 필요에 따라 옵션이 제공되거나 대체 응답이 있지만 (옵션 및 대체 응답)이 아닌지 확인하기 위해 검사 제한 조건을 추가 할 것입니다.
편집 : AlternateResponse의 통신 데이터 유형.
완벽한 세계에서는 제네릭 개념을 사용 하여 AlternateReponse에 대한 다양한 데이터 유형을 처리 할 수 있습니다 . 아아 우리는 완벽한 세상에 살고 있지 않습니다. 내가 생각할 수있는 가장 좋은 방법은 PollQuestion 테이블에 AlternateResponse 데이터 유형을 지정하고 AlternateReponse를 nvarchar로 데이터베이스에 저장하는 것입니다. 아래는 업데이트 된 질문 스키마와 새로운 데이터 유형 테이블입니다.
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
)
이 QuestionDataType 테이블에서 선택하여 질문 작성자에 대해 사용 가능한 모든 데이터 유형을 나열 할 수 있습니다. UI는 QuestionDataTypeId를 참조하여 대체 응답 필드에 적합한 형식을 선택할 수 있습니다. TSQL 데이터 형식으로 제한되지 않으므로 "전화 번호"는 데이터 형식이 될 수 있으며 UI에서 적절한 서식 / 마스킹을 얻을 수 있습니다. 또한 필요한 경우 대체 답변에서 모든 종류의 처리 (선택, 유효성 검사 등)를 수행하기 위해 간단한 case 문을 통해 데이터를 적절한 유형으로 캐스트 할 수 있습니다.