Sql server MSSQL中的表设置

Sql server MSSQL中的表设置,sql-server,vb.net,Sql Server,Vb.net,我正在寻找在以下场景中设置SQL表的最佳方法 我会尽力解释我的情况 例如,我有10个测试,Test1,Test2,Test3,…,Test10。它们都使用相似的字段,但一些测试将根据测试使用不同的字段 假设Test1使用Field1、Field2、Field3。测试2使用字段1、字段2、字段4和字段5。我需要将所需的字段信息存储到表中,但我还需要存储每个测试使用的字段。我将使用VB.net访问此信息 我正在寻找最好的方法来建立这个。它需要有点容易维护,但也有相当好的性能 我最初的想法是设置两张桌

我正在寻找在以下场景中设置SQL表的最佳方法

我会尽力解释我的情况

例如,我有10个测试,Test1,Test2,Test3,…,Test10。它们都使用相似的字段,但一些测试将根据测试使用不同的字段

假设Test1使用Field1、Field2、Field3。测试2使用字段1、字段2、字段4和字段5。我需要将所需的字段信息存储到表中,但我还需要存储每个测试使用的字段。我将使用VB.net访问此信息

我正在寻找最好的方法来建立这个。它需要有点容易维护,但也有相当好的性能

我最初的想法是设置两张桌子。一个表将存储每个测试结果,另一个表将存储用于每个测试的字段。 存储每个测试结果的一个将具有任何测试可以使用的所有可能列。每个测试将使用哪些字段的表也将包含所有可能的列。在本例中,每一行都是一个测试,每一列都是用于该测试的字段。因此,Test1在第1列、第2列和第3列中都有一个1。Test2在第1列、第2列、第4列和第5列中将有一个1。这将告诉我们在选择、更新或插入结果表时需要使用哪些字段

希望这对我正在努力实现的目标是有意义的。我不确定这是否是实现我的要求的最佳方式

如蒙指导,不胜感激

谢谢, 托尼

更新 我只是想澄清一下,我使用的是MS SQL

更新
我还想澄清一下,我的字段名实际上不是字段1、字段2等。我只是用它来解释我要完成的任务。

我认为更好的方法是使用自定义字符作为分隔符,例如
|
字符 像这样

somthing |另一个字段|另一个字段数据

当您想读取按
|

您还可以通过此方案保存选定的值

1 | 3 | 5 | 2 | 0 | 4 | 1 | 2


您只需要2个字符串字段来存储问题和答案:)

我相信您需要的是一个可变列表。特别是如果你考虑增加更多测试的长期影响。 有一点是肯定的,解决问题的方法是添加一组具有通用名称的列(field1、2、3…40),并根据需要使用它们,希望永远不需要40。这使得设计在开发和维护方面存在很大问题

一种不那么可怕但仍然存在问题的方法是创建一个表,该表以数据透视字段,并使字段各自成为自己的行,并将两者关联起来

使用现代数据库的更好解决方案是以无模式类型的方式存储对象(测试)。在支持它的关系数据库中,您可以使用原生XML字段(或某些数据库中的json)。在这个场景中,将有关对象的元数据存储在常规字段中,并将XML序列化对象存储在XML字段中。这样,您的对象可以根据需要进行更改,而无需更改数据库模式,并且您可以继续使用有意义的名称和数据类型

在关系数据库场景中,重要的是选择具有本机xml或json数据类型的数据库,而不是仅使用varchar或blob。原因是本机类型将包括以通常比正则表达式性能更好的方式查询数据的能力

当然,这是MongoDB这样的sql数据库所不擅长的。这两种方法我都很成功。对于简单的解决方案,我通常会选择Mongo。对于需要关系数据库的解决方案,我将使用MS-SQL和SQLXml


SteveJ你需要四张桌子。测试和字段具有多对多关系,因此需要这两个表加上一个TestsFields连接表。最后,您需要一个包含TestNumber、Fieldnumber和Result字段的结果表。这符合你问题中给出的信息,尽管有点模棱两可。您可能需要扩展这个模式来容纳多个测试会话/测试,或者其他什么-您没有给出这个上下文,所以我不能说

编辑:

例如,让我们以汽车维修应用程序为例。 (不幸的是,您为其中一个表选择了“字段”,我想在下面的内容中使用“字段”,因此我通过大写字母区分它们)在这种情况下,Tests表将具有字段TestID和Description,其值类似于1,“交货前检查”,2,“5000英里服务”等和字段表将包含字段ID和说明,值如1“检查轮胎压力”,2“检查手制动电缆”等。 然后连接表TestsFields将只包含两个主键

在这种情况下,您还需要另外一张或两张表来涵盖个人车辆、服务预约等,但我们不要太过激动

结果表将包括ServiceApptID、TestID、FieldID和结果。结果可以是自由文本,技工可以在其中记录结果,或者另一次查找一组固定的响应-1“调整”,2“部分替换”等


MySQL和SQL Server是两种完全不同的数据库。您需要一个表来创建测试与其使用的字段之间的关系。请查看此处的答案。我已经为此挣扎了好几次。我的建议是使用NoSql数据库(如MongoDB),或者使用支持可查询的本机XML数据类型的数据库(如MS-SQL或PostreSQL)。在后面的场景中,将元数据存储在字段中,将对象(测试)存储在xml中。这种方法的问题在于,很难对测试结果提出有意义的问题。例如,您不能轻易地要求计算所有第n个测试r