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

上次我做一个问答系统时,它处理了由多页问题组成的调查。答案可以是复选框、单选按钮或用于多项选择的选择框,或文本输入(可选地限制为整数值)。

这些表看起来像这样:

-- 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

查询一直在限制 a 中允许的表数SELECT,256 左右。

于 2012-08-03T01:02:08.037 回答
1

我绝对不会选择浮点数,因为它是一种非精确和非确定性的数据类型。尝试改用 bigint。据我所知,浮点数很难放入索引中。不知道 sql 数据库 (azure) 和/或 sql server 2012 虽然

于 2012-08-03T09:38:28.567 回答
0

这取决于您的问题将如何构建。

如果您有自由文本输入,并且只有一个正确答案,那么将问题与答案分开是没有意义的,因此在问题表中有一个答案字段。但是你依赖正确的拼写等。

如果您计划对一个问题提供多项选择答案,那么您希望在 Answers 表中拥有 QuestionID,而不是上面的设置。

您还可以在问题和答案之间设置一个表格,以便一个答案可以是多个问题的答案。

而且您的 ID 想要是整数,而不是浮点数;如果超出整数范围,请使用唯一标识符。浮点数不精确

于 2012-08-02T19:22:00.520 回答