MSSQL

时间:2016-12-19 17:27:21

标签: sql-server vb.net

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

我会尽力解释我的情况。

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

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

我正在寻找设置它的最佳方法。它需要有点容易维护,但也有相当好的性能。

我最初的想法是设置两个表。一个表将存储每个测试结果,另一个表存储用于每个测试的字段。 存储每个测试结果的那个将具有任何测试可以使用的每个可能的列。每个测试将使用的字段表也包含所有可能的列。在这种情况下,每行都是一个测试,每列将是哪个字段用于该测试。因此,Test1在Column1,Column2和Column3中的值为1。 Test2在Column1,Column2,Column4和Column5中的值为1。这将告诉我们在选择,更新或插入结果表时需要使用哪些字段。

希望这对我想要完成的事情有意义。我不确定这是否是满足我要求的最佳方式。

非常感谢任何指导。

谢谢, 贝

更新 我只是想澄清我正在使用MS SQL。

更新 我还想澄清一下,我的字段名称实际上不是Field 1,Field2等。我只是用它来尝试解释我想要完成的事情。

3 个答案:

答案 0 :(得分:0)

我相信你要求的是一个可变列表。特别是如果你考虑添加更多测试的长期影响。

有一点可以肯定,不解决问题的方法是添加一堆具有通用名称的列(field1,2,3 ...... 40)并根据需要使用它们,希望您永远不需要40这使得设计在开发和维护方面存在很大问题。

一种不太可怕的方法,但仍然存在问题,就是制作一个能够使字段转动并使它们各自成为自己行的表格,并将两者联系起来。

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

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

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

SteveJ

答案 1 :(得分:0)

你需要四张桌子。测试和字段具有多对多关系,因此您需要这两个表以及TestsFields联结表。最后,您需要一个包含TestNumber,Fieldnumber和Result字段的结果表。这符合你问题中给出的信息,虽然它有点含糊不清。你可能需要扩展这个模式以适应多个testsessions /考试,或者其他什么 - 你没有给出这个上下文所以我不能说。

编辑:

例如,我们以汽车维修应用为例。 (不幸的是你为你的一个表选择了'Fields',我想在后面使用'fields',所以我用大写字母区分它们)在这种情况下,Tests表将包含TestID和Description字段,值为1,'交付前检验',2,'5000英里服务'等和字段表将具有fieldID和Description,其值为1,'检查轮胎压力',2,'检查手刹电缆'等。 然后,联结表TestsFields将只包含两个主键。

在这种情况下,您还需要另外一两个表来覆盖各个车辆,服务预约等,但不要让它们被带走!

结果表将包括ServiceApptID,TestID,FieldID和Result。结果可以是自由文本,其中机制可以记录结果,或者对一组预制响应进行另一次查找 - 1'调整',2,'部分替换'等

应该足够了解这个想法。

答案 2 :(得分:-1)

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

somthing|another field|another filed data

当您想要读取按|

分割的数据时

并且您也可以通过此方案保存所选值

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

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