具有可变数据类型的SQL数据库列
我正在编写一个应用程序,用户可以在其中向表单添加“输入”。这些输入可以是多种不同的类型,包括文本框或复选框 在文本框和复选框的情况下,数据类型是字符串和布尔值 有关我的应用程序的更多信息 1) 用户可以创建一个“表单”,其中可能有多种不同类型的输入供客户填写。这里有一些例子。这些输入可以是动态的,由用户创建具有可变数据类型的SQL数据库列,sql,sql-server,Sql,Sql Server,我正在编写一个应用程序,用户可以在其中向表单添加“输入”。这些输入可以是多种不同的类型,包括文本框或复选框 在文本框和复选框的情况下,数据类型是字符串和布尔值 有关我的应用程序的更多信息 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