2012-08-02 72 views
0

我需要在我的SQL(Azure)服务器中构建'问题和答案'的良好结构。 我想在做这种方式:如何在SQL中组织问题和答案?

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) 

难道你们知道一些其他的好办法做到这一点?

谢谢。

+0

是否有命令的问题?问题是问题的一部分,例如调查?是/否,多项选择,数字或文章?你关心谁回答了问题,何时和多久?问题可能随时间而改变或退休? BIGINT是否不足以用于识别? – HABO 2012-08-02 19:36:36

+0

@HABO在问题中有一个顺序,是的,有一些问题的答案是肯定的,是的,我关心谁回答了问题,问题可以添加但不会随着时间而改变,以保持答案的完整性。 – 2012-08-02 21:20:12

回答

1

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

的表看起来是这样的:

-- 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左右的表的数量限制。

+0

感谢@HABO,这给了我一些想法。 – 2012-08-08 08:47:06

0

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

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

如果你打算有一个问题的多项选择答案,那么你会希望在Answers表中有QuestionID,而不是你上面的设置。

您可以在问答之间另外添加一个表格,因此答案可以是对多个问题的答案。

而你的ID想要是整数,而不是浮动;如果您超出了整数范围,请使用uniqueidentifiers。花车不是精确

+1

至于ID,'bigint'当然也值得一提,使用'uniqueidentifier'的一半大小,范围肯定足够大(2^63)。 – Lucero 2012-08-02 19:37:42

+1

我的意思是一般意义上的int,但我怀疑甚至会有2^32个问题:) – podiluska 2012-08-02 19:40:26

+1

当然,我也不期望超过2^31个问题(假设不应该使用否定ID)。 – Lucero 2012-08-02 20:47:16

1

我肯定不会去浮动,因为它是一个非精确的和非确定性的数据类型。尝试使用bigint代替。 据我所知,浮动很难投入索引。不知道有关SQL数据库(天蓝色)和/或SQL Server 2012虽然

+0

谢谢@Mark,明白了! =] – 2012-08-03 14:58:00