0

SQL(Azure)サーバーで「質問と回答」の適切な構造を構築する必要があります。私はこのように考えています:

table question
    id float (we could have lots of questions, so that's why float and don't int)
    nvarchar question (question can vary in size of characters)
    id_answer float

table answer
    id float
    nvarchar answer

これはあなたの意見では良い方法ですか?私はさまざまな種類の質問について考える必要があります、私はこれらのような質問を持つことができます:

question: Who invented the lamp ?
answer:   Thomas Edson

question: Thomas Edson invested the lamp ?
answer: No. (true or false)

あなたたちはこれを行うための他の良い方法を知っていますか?

ありがとう。

4

3 に答える 3

1

前回Q&Aシステムを行ったときは、複数ページの質問からなる調査を処理していました。回答は、チェックボックス、ラジオボタン、複数選択用の選択ボックス、またはテキスト入力(オプションで整数値に制限)の場合があります。

テーブルは次のようになりました。

-- There are pages of questions.

CREATE TABLE [dbo].[Pages] (
    [PageId] [int] IDENTITY (1, 1) NOT NULL ,
    [Name] [varchar] (128) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL ,
    [Description] [varchar] (1024) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL ,
    [PageTypeId] [int] NOT NULL 
) ON [PRIMARY]
GO

CREATE TABLE [dbo].[PageTypes] (
    [PageTypeId] [int] IDENTITY (1, 1) NOT NULL ,
    [Name] [varchar] (32) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL ,
    [Description] [varchar] (1024) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL 
) ON [PRIMARY]
GO

CREATE TABLE [dbo].[TargetPages] (
    [QuestionId] [int] NOT NULL ,
    [PageId] [int] NOT NULL ,
    [Rank] [int] NOT NULL 
) ON [PRIMARY]
GO

-- Questions have input fields.  Perhaps a text entry, perhaps several multiple-guess choices.

CREATE TABLE [dbo].[Questions] (
    [QuestionId] [int] IDENTITY (1, 1) NOT NULL ,
    [StartDate] [datetime] NOT NULL ,
    [EndDate] [datetime] NOT NULL ,
    [Description] [varchar] (1024) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL ,
    [Filespec] [varchar] (128) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL
) ON [PRIMARY]
GO

CREATE TABLE [dbo].[Fields] (
    [QuestionId] [int] NOT NULL ,
    [FieldId] [int] IDENTITY (1, 1) NOT NULL ,
    [FieldName] [varchar] (64) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL ,
    [InputTypeId] [int] NOT NULL ,
    [Description] [varchar] (256) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL 
) ON [PRIMARY]
GO

CREATE TABLE [dbo].[InputTypes] ( -- Roughly: checkbox, radio button, text, textarea or select list.
    [InputTypeId] [int] IDENTITY (1, 1) NOT NULL ,
    [InputTypeName] [varchar] (50) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL ,
    [Choices] [bit] NOT NULL ,
    [NumericValue] [bit] NOT NULL
) ON [PRIMARY]
GO

CREATE TABLE [dbo].[Choices] ( -- Defines radio button or select list choices for multiple choice questions.
    [FieldId] [int] NOT NULL ,
    [cName] [varchar] (64) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL ,
    [cValue] [varchar] (64) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL ,
    [Rank] [int] NOT NULL 
) ON [PRIMARY]
GO

-- Then we have the answers supplied by users.

CREATE TABLE [dbo].[Inquiries] ( 
    [InquiryId] [int] IDENTITY (1, 1) NOT NULL ,
    [UserId] [int] NOT NULL ,
    [QuestionId] [int] NOT NULL ,
    [dTimestamp] [datetime] NOT NULL ,
    [ResponseSequence] [int] NOT NULL
) ON [PRIMARY]
GO

CREATE TABLE [dbo].[Users] (
    [UserId] [int] IDENTITY (1, 1) NOT NULL ,
    [Username] [varchar] (16) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL
) ON [PRIMARY]
GO

CREATE TABLE [dbo].[Responses] ( -- Multiple choice.
    [InquiryId] [int] NOT NULL ,
    [FieldId] [int] NOT NULL ,
    [FieldValue] [varchar] (1024) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL 
) ON [PRIMARY]
GO

CREATE TABLE [dbo].[IntegerResponses] ( -- User supplied integer or multiple choice value.
-- NB: Checkbox values are handled thusly: a row here indicates the box was checked, no row is unchecked.  The value is meaningless.
    [InquiryId] [int] NOT NULL ,
    [FieldId] [int] NOT NULL ,
    [FieldValue] [int] NOT NULL 
) ON [PRIMARY]
GO

CREATE TABLE [dbo].[TextResponses] ( -- User supplied text.
    [InquiryId] [int] NOT NULL ,
    [FieldId] [int] NOT NULL ,
    [FieldValue] [varchar] (1024) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL 
) ON [PRIMARY]
GO
exec sp_addextendedproperty N'MS_Description', N'1 ==> Values are in the   Choices   table.', N'user', N'dbo', N'table', N'InputTypes', N'column', N'Choices'
GO
exec sp_addextendedproperty N'MS_Description', N'1 ==> Values are numeric.', N'user', N'dbo', N'table', N'InputTypes', N'column', N'NumericValue'
GO

SELECTクエリは、256程度で許可されるテーブル数の制限に達し続けました。

于 2012-08-03T01:02:08.037 に答える
1

それは非正確で非決定論的なデータ型であるため、私は絶対にフロートには行きません。代わりにbigintを使用してみてください。私の知る限り、フロートをインデックスに入れるのは非常に難しいです。SQLデータベース(azure)やSQLServer2012についてはわかりませんが

于 2012-08-03T09:38:28.567 に答える
0

それはあなたの質問がどのように構成されるかによります。

正解が1つだけのフリーテキスト入力がある場合は、質問と回答を区別する意味がないため、質問テーブルに回答フィールドを用意します。しかし、あなたは正しいつづりなどに頼っています。

質問に対する複数の選択肢の回答を計画している場合は、上記の設定ではなく、回答テーブルにQuestionIDを含める必要があります。

さらに、質問と回答の間にテーブルを作成して、回答が複数の質問に対する回答になるようにすることもできます。

また、IDはfloatではなくintになりたいです。intの範囲を超える場合は、uniqueidentifiersを使用してください。フロートは正確ではありません

于 2012-08-02T19:22:00.520 に答える