2

我意识到在很多情况下,输入“无”似乎并不那么糟糕。但是,我想在另一个表中使用这个特定查找表(几千行)中的值,该表包含几个与来自查找表的数据直接相关的不可为空的字段。

真实场景:

查找表是通用药物名称的列表,并包含用于加入与我们的应用程序分开的其他数据库的代码。

我们有一个处方表,其中存储 DrugId、OrderId (FK)、频率、剂量等,所有这些目前都是不可为空的。

在某些情况下,订单的处方信息是必需的,因此仅通过没有记录(并且没有其他跟踪方式)来解决问题是不够的——我们需要能够知道为什么没有输入处方并且能够在以后查看数据时重新填充正确的原因。

一个想法是添加“无”作为药物查找表的一部分,这构成了这个问题的基础。我担心采用这种方法有几个原因:

  • 似乎在每种情况下,当我们想要使用数据时,我们都记得要考虑到这一点(有几个小例外,因为作为 3rd 方数据库的内部连接。)
  • 对于任何加入该项目的人来说,这似乎都非常不明显(更不用说屁股痛了),并且必须进行独特的测试。也许单独使用“None”并没有那么糟糕,但是我们想在组合中添加“Declined”或“Don't Know”呢?现在,我们的查找表中有 3 个不明显的异常,每次访问数据时都必须考虑这些异常。
  • 我们要么使当前所需的字段为空,要么在其中插入虚假数据。

解决这种情况的其他想法是:

  • 在订单中添加一个新列,其中包含“有处方”、“拒绝”、“无处方”等选项。这是不希望的,因为数以万计的行将是“空的”,但在其他方面似乎并不算太​​糟糕。

  • 创建一个新表以仅记录“异常”情况,例如“无”或“不知道”何时需要该字段。目前,这是最吸引我的一个,因为它产生了非常明显的例外情况,必须加以说明。当然,缺点是列数很少的新表(零关系)。这似乎是用于重新填充 UI 的最简单的数据形式。

SO社区的想法?

4

2 回答 2

1

你不应该简单地做这样的事情吗?

在此处输入图像描述

(可能带有确保失败订单不能有处方的触发器。)

或者,您实际上需要为每个处方提供单独的失败原因?

于 2012-08-24T00:19:17.927 回答
0

您可以添加两个字段来订购

LookupValueID NULL FK,
PrescriptionType tinyint

PrescriptionType = (Present = 1, Null = 2, Declined = 3, DontKnow = 4, ...)

并添加一个 CHECK 约束:

(PrescriptionType = 1 AND LookupValueID IS NOT NULL)
OR (PrescriptionType <> 1 AND LookupValueID IS NULL)

这样,您将恒定数量的常见特殊情况内联到主表中(Orders我认为)并使用约束来强制数据正确性。

于 2012-08-23T16:57:07.890 回答