具有变体数据类型的SQL数据库列

时间:2014-12-22 18:15:22

标签: sql sql-server

我正在编写一个应用程序,用户可以在其中向表单添加“输入”。这些输入可以是多种不同类型,包括文本框或复选框。

对于文本框与复选框,数据类型为字符串与布尔值。

有关我的应用程序的更多信息

1)用户能够创建一个“表单”,可以为客户填写多种不同类型的输入。这里有些例子。这些输入可以是动态的,也可以由用户创建。

  • 可能要求输入用户名的输入。
  • 一个输入,其中包含一个复选框,询问用户是否想要在简报中注册。

2)用户保存表单,并在数据库中根据类型保存新创建的输入。

3)新用户进入应用程序并填写刚刚创建的新表单。他们填写原始管理员创建的输入,例如他们的姓名,他们回答是,以便注册新闻通讯。然后他们点击提交。

4)然后数据库保存输入的答案。这就是我的问题所在。

我的问题是如何将输入值存储在SQL中的一行中。我将提供一些解决方案,但我正在就这种情况下通常采取的措施达成共识。

  1. 解决方案#1
  2. 输入名称

    输入布尔值 - (当不是布尔类型的输入时将为NULL)

    输入字符串值 - (当不是字符串类型的输入时将为NULL)

    1. 解决方案#2
    2. 输入名称

      输入类型

      输入值(类型字符串,我会根据类型强制转换)

      1. 解决方案#3
      2. 输入名称

        输入类型

        输入值键 - (根据输入类型,表的弱外键。这不是真正的外键,因为它可能指向多个不同的表)

2 个答案:

答案 0 :(得分:1)

每种数据类型的表怎么样,每行指向包含的表单?例如:

FormTable
FormId      SomeOtherFields
1           Blah
2           Bleh

BooleanFieldsTable
BooleanFieldId     FormId     DisplayName     Value
1                  1          Married         True
2                  2          Finished        False

IntFieldsTable
IntFieldId         FormId     DisplayName     Value
1                  1          Age             35
2                  1          Amount          4

DateTimeFieldsTable
DateTimeFieldId    FormId     DisplayName     Value
1                  2          Purchase Date   2014-12-15 16:25:56.187

VarcharFieldsTable
VarcharFieldId     FormId     DisplayName     Value
1                  1          Name            John

答案 1 :(得分:0)

当我实施像今年这样的系统时,我选择了选项2.我经常后悔,并希望我做了选项3.我希望如果我选择了3,我可能也会后悔。

选项2使一些事情变得更容易......链接中的链接更少,逻辑更少,但是在演员阵容中有更多的逻辑。

选项3使一些事情变得更容易......在铸造中减少铸造和减少逻辑,但链接中的逻辑更多。

当时SQL Server遇到了一个错误,使得在许多情况下选项2难以实现。我不知道他们是否修复了这个错误。

以下是该错误的示例(注意它并不总是显示,取决于表格大小和许多其他因素):

  SELECT CAST(field as int) 
  FROM table1 
  WHERE selectorField = 5

在某些情况下,如果行(不是selectorField = 5)无法转换为int类型,则此查询将失败并显示非法转换错误。

如果此问题仍然存在,您可以使用选项3。