2011-08-16 36 views
4

我建立在ASP.NET,C#,MVC3一个形式呈现给用户填写一份申请表和SQL Server 2008存储可变数据

(姓名,电子邮件地址等)。 我希望允许应用程序的管理员为此表单添加额外的动态问题。

额外问题的数量和返回的数据类型会有所不同。 例如,管理员可以添加以下类型的问题的0,1或更多:

  1. 你有一个完整的,清洁的驾驶liscence?
  2. 给你的驾驶技巧评分从1到5.
  3. 描述你最后一次长途旅行吗?
  4. 等...

注意,所提供的答案可能是二进制文件(问题1),整数(问题2)或自由文本(Q.3)。

在MS SQL中存储像这样的随机数据的最佳方式是什么?

任何帮助将大大appriecated。

在此先感谢。

+4

考虑使用EAV - 尽管它有问题,但它比为每个新问题添加新列更可维护(恕我直言)。我前段时间在博客上写道:http://sqlblog.com/blogs/aaron_bertrand/archive/2009/11/19/what-is-so-bad-about-eav-anyway.aspx我认为你应该分开你的问题分为两部分,以涵盖数据库设计和应用程序设计以支持它。首先担心数据库设计,然后攻击应用程序解决方案。 –

+0

干杯亚伦,我会检查你的博客文章。我也把这个问题分成了两个部分(我需要等20分钟才问)。再次感谢! –

+0

尼斯EAV的文章亚伦。根据我以前使用过的用于udfs的XML列的一些评论。 –

回答

1

我会创建一个表格,其中包含以下列,并将变量的名称与值一起存储在适当的列中,其值为空。

id:int (primary) 
name:varchar(100) 
value_bool:bit(nullable) 
value_int:int (nullable) 
value_text:varchar(100) (nullable) 
+0

这正是我提出的解决方案,尽管我在张贴^ _ ^之前去吃午饭。我认为你甚至可以存储一个额外的int来表示value_type,但是,使用编码逻辑检查null,这不是必须的。无论哪个作品! –

+0

我已经使用这种方法去创建类似于Google表单可以动态创建的东西。 – Caimen

+0

OP提到“二进制”,但它们实际上意味着位(例如是/否)。你可以为此重载int列(也许用更多列来更明确地检查类型),或者保留第三列只是将二进制更改为位。 –

1

除非空间是问题,否则我会使用VARCHAR(MAX)。它可以提供多达8000个字符并存储数字和文本。

编辑:其实正如Aaron指出的那样,这会给你20亿字(足够一本书)。你可以使用VARCHAR(8000)或类似的东西,最多可以提供8000个字符。由于它是VARCHAR,它不会占用空的空间(所以0或1不会占用8,000个字符的空间,只有1个空间)。

+0

此方法的问题是您将无法使用SQL在稍后提取某些值。你必须提取整个值并解析它。 – Caimen

+1

VARCHAR(MAX)为您提供20亿个字符,而不是8,000个字符。然而,对于其答案只能是'1'或'0'的一些问题,这看起来有点矫枉过正...... –

+0

亚伦,你是对的,对不起。 –