1

我有一个三张桌子

结果: TestID TestCode 值

测试: TestID TestType SysCodeID

SystemCodes SysCodeID ParentSysCodeID 说明

我的问题是用户何时将数据输入结果表。

如果 testCode 的类型为 SystemList,则行获得焦点时的格式代码会将值字段更改为下拉组合框。下拉列表包含所有具有 test.SysCodeID 的 parentsyscodeID 的系统代码。当用户在列表中选择一个值时,它会转换为一个进入值字段的数字。

Results.Value 字段的数据类型是整数。我将其设为整数而不是字符串,因为在报告时,如果它是数字,则更容易进行计算和排序。如果您将整数/十进制值放入字符串字段,则会出现问题。同样,在设计系统时,他们只需要数字。

用户现在想要将字符串放入值字段以及列表中的数字/值,我想知道最好的方法是什么。


将字段转换为字符串然后将字符串和整数存储在同一个字段中会是不好的做法吗?有与此相关的不同问题,但我不确定是否有什么大不了的。

我是否应该在字符串数据类型表中添加另一列,如果测试是字符串类型,则将用户输入的数据放入不同的字段中。

另一种选择是创建与另一个表的 1-1 关系,如果用户在 value 字段中键入字符串,它会将其添加到带有数字键的新表中。

有人有什么有趣的想法吗?

4

8 回答 8

2

你是说他们想做自由格式的文本输入吗?如果是这样,他们将破坏在现场进行有意义的报告的能力,因为我可以保证他们不会始终如一地输入字符串。

如果他们要输入几个预设字符串之一(例如,A、B、C 等的等级),则为这些字符串创建一个查找表,该表映射到用于排序、评估、平均等的数值。

如果他们真的希望能够开始输入自由格式的文本并且您无法劝阻他们,请沿 other_entry 行添加另一列。有一个预定义的值,意思是“其他”放入你的值列。这样,当您进行报告时,您可以汇总所有这些随机的“其他”值,也可以简单地忽略它们。确保将“其他”添加到 SystemCodes 表中,以便在该表和结果表之间保留一个外键。如果您还没有,那么您绝对应该考虑添加一个。

祝你好运!

于 2009-04-02T18:08:32.760 回答
2

如果将 Results.Value 视为一个数字 ValueCode 并成为引用另一个表的外键,该表包含一个 ValueCode 和一个与之匹配的字符串。

CREATE TABLE ValueCodes
(
    Value     INTEGER NOT NULL PRIMARY KEY,
    Meaning   VARCHAR(32) NOT NULL UNIQUE
);

CREATE TABLE Results
(
   TestID     ...,
   TestCode   ...,
   Value      INTEGER NOT NULL FOREIGN KEY REFERENCES ValueCodes
);

您继续像现在一样存储整数,但它们是对 ValueCodes 表中一组有限值的引用。大多数现有值显示为整数,例如 100,字符串表示相同的值“100”。可以根据需要添加新代码。

于 2009-04-04T00:42:58.077 回答
1

用户现在想要将字符串放入值字段以及列表中的数字/值,我想知道最好的方法是什么。

听起来用户想要添加新的“testCodes”。如果是这种情况,为什么不将它们添加到您现有的测试代码表中并保留您现有的格式。

将字段转换为字符串然后将字符串和整数存储在同一个字段中会是不好的做法吗?有与此相关的不同问题,但我不确定是否有什么大不了的。

不,这没什么大不了的。通常 PO 编号或 Invoice 编号具有数字或字母和数字的组合。但是,关于数据库在数字字段而不是字符串上的性能,您是对的,但是如果您索引字符串字段,那么最终数据库会在数字索引上进行扫描。

您可能在将小数作为字符串时遇到的问题可能与浮点数据类型有关,在这些数据类型中,服务器基本上估计字段的值并且只保留一定数量的数字的准确性。如果您担心数字,这可能会导致大量舍入错误。您可以通过使用具有小数静态精度的货币字段等来避免该问题。大声笑我很难学到这一点。

Tom H. 在解决其他所有问题方面做得很好。

于 2009-04-03T23:26:38.027 回答
0

我认为最简单的方法是将 Results.Value 转换为“字符串”(char、varchar 等)。是的,这破坏了进行数字排序的能力(并且您将无法再对列进行强制转换或转换,因为文本将与整数值混合),但我认为任何其他方法都太复杂了保养得当。(例如,在您提到的 1-1 情况下,该整数值是实际值还是字符串表的外键?现在我们需要另一列来确定。)

于 2009-04-02T16:46:31.583 回答
0

我会为字符串值创建额外的列。这不是真正的规范化,但它是最容易实现和使用的。

只要你不打算对数字做任何事情,比如求和或排序,对数字和字符串使用相同的字段就可以了。

从规范化的角度来看,额外表格方法虽然很好,但可能过于复杂。

于 2009-04-02T16:47:08.760 回答
0

我会将值字段转换为字符串并添加一列,指示应将数据类型视为后处理和报告的数据类型。

于 2009-04-02T16:51:27.937 回答
0

Sql Server 至少有一个 IsNumeric 函数可以使用:

ORDER BY IsNumeric(Results.Value) DESC, 
         CASE WHEN IsNumeric(Results.Value) = 1 THEN Len(Results.Value) ELSE 99 END,
         Results.Value
于 2009-04-02T16:55:30.847 回答
0

想到了两种解决方案之一。这有点取决于您对数字的处理方式。如果它们只是代表某种选择,那么选择一个。如果您需要对其进行数学运算(排序、转换等),请选择另一个。

  1. 将列更改为 varchar,然后将数字或文本放入其中。按数字排序会很糟糕,但是,嘿,它是一列。

  2. 既有文本的 varchar 列,又有数字的 int 列。使用视图隐藏差异,并在必要时控制排序。如果您不关心查看的是数字还是文本,可以将这两列合并在一起。

于 2009-04-02T18:10:34.567 回答