Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
具有可变数据类型的SQL数据库列_Sql_Sql Server - Fatal编程技术网

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

具有可变数据类型的SQL数据库列,sql,sql-server,Sql,Sql Server,我正在编写一个应用程序,用户可以在其中向表单添加“输入”。这些输入可以是多种不同的类型,包括文本框或复选框 在文本框和复选框的情况下,数据类型是字符串和布尔值 有关我的应用程序的更多信息 1) 用户可以创建一个“表单”,其中可能有多种不同类型的输入供客户填写。这里有一些例子。这些输入可以是动态的,由用户创建 可能要求输入用户名的输入 由一个复选框组成的输入,询问用户是否希望注册新闻稿 2) 用户保存表单,并根据类型在数据库中保存新创建的输入 3) 新用户进入应用程序并填写刚刚创建的新表单。他

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

在文本框和复选框的情况下,数据类型是字符串和布尔值

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

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

  • 可能要求输入用户名的输入
  • 由一个复选框组成的输入,询问用户是否希望注册新闻稿
2) 用户保存表单,并根据类型在数据库中保存新创建的输入

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

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

我的问题是如何在SQL中在行中存储输入值。我有几个解决方案,我将提供,但我正在寻找一个在这种情况下通常做什么的共识

  • 解决方案#1
  • 输入名称

    输入布尔值-(如果不是布尔类型的输入,则为空)

    输入字符串值-(如果不是字符串类型的输入,则为空)

  • 解决方案#2
  • 输入名称

    输入类型

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

  • 解决方案#3
  • 输入名称

    输入类型


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

    对于每种数据类型,每一行都指向包含表单的表如何?例如:

    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
    

    几年前,当我实施这样一个系统时,我选择了选项2。我经常后悔,并希望我做了选择3。我想如果我选择了选项3,我也会后悔的

    选项2使一些事情变得更容易。。。在连接中减少连接和逻辑,但在铸造中增加逻辑

    选项3使一些事情变得更容易。。。尽量避免在施法中使用较少的逻辑,但在连接中使用较多的逻辑

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

    下面是一个bug示例(注意,它并不总是表现出来,这取决于表大小和许多其他因素):

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


    如果此问题仍然存在,您希望选择选项3。

    我不建议您根据前端做出数据库设计决策。他们应该被他们所代表的数据的真实性所驱动。我同意你的观点。但在本例中,输入表示输入名称和该输入的值。该值可以是多种不同的类型,一个bool与一个字符串,无论哪个UI正在使用数据。您是否建议将所有值作为字符串处理,并根据输入类型将它们转换为各自的类型?我想我需要更好地理解您的应用程序才能提出任何建议。听起来你试图以一种与上下文无关的方式来做这件事,对我来说,在设计数据库时,上下文就是一切。关于“输入1”的数据有什么好处?如果开发人员对前端的输入进行重新排序/重新命名,那么数据库与前端的关系将丢失。请参阅“关于我的应用程序的更多信息”,这可能值得一读:这不是一个坏主意。我唯一不喜欢的就是我现在的问题。对于FormId 1,我如何知道应该在BooleanFieldsTable而不是IntFieldsTable中查找值。我想我可以说,is InputType==“Boolean”,转到BooleanFieldsTableYou应该
    左连接
    所有的表,当然。我认为这不应该是个问题。不需要在任何地方存储任何“InputType”,关系本身中就有这些信息。
      SELECT CAST(field as int) 
      FROM table1 
      WHERE selectorField = 5