Database design 我应不应该说「;无”;进入我的查找表?

Database design 我应不应该说「;无”;进入我的查找表?,database-design,lookup-tables,Database Design,Lookup Tables,我意识到,在很多情况下,把“无”放在第一位似乎并不那么糟糕。但是,我想在另一个表中使用这个特定查找表(数千行)中的值,该表包含几个不可为空的字段,这些字段直接与来自查找表的数据相关 真实世界场景: 查找表是通用药物名称的列表,包含用于连接与我们的应用程序分离的其他数据库的代码 我们有一个处方表,其中存储了DrugId、OrderId(FK)、频率、剂量等,所有这些目前都不可为空 在某些情况下,需要医嘱的处方信息,因此仅通过没有记录(以及没有其他跟踪手段)来解决问题是不够的——我们需要能够知道为什

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

真实世界场景:

查找表是通用药物名称的列表,包含用于连接与我们的应用程序分离的其他数据库的代码

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

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

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

  • 似乎在每个场景中,当我们想要使用数据时,我们都会记得对此进行解释(有几个小的例外,因为作为第三方数据库的内部连接)
  • 这对于任何参与该项目的人来说似乎都不明显(更不用说屁股上的痛了),必须进行测试。也许单独使用“无”并不坏,但是我们想在组合中添加“拒绝”或“不知道”呢?现在,在我们的查找表中有3个不明显的异常,每次访问数据时都必须对这些异常进行说明
  • 我们要么使当前所需的字段为空,要么在其中插入虚假数据
解决这种情况的其他想法包括:

  • 在订单中添加一个新列,选项包括“有处方”、“拒绝”、“没有处方”。这是不需要的,因为数以万计的行将为“null”,但在其他情况下似乎并不太糟糕

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


关于SO社区的想法?

您可以在订单中添加两个字段

LookupValueID NULL FK,
PrescriptionType tinyint
使用
PrescriptionType=(Present=1,Null=2,谢绝=3,DontKnow=4,…)

并添加一个检查约束:

(PrescriptionType = 1 AND LookupValueID IS NOT NULL)
OR (PrescriptionType <> 1 AND LookupValueID IS NULL)
(PrescriptionType=1且LookupValueID不为空)
或(PrescriptionType 1和LookupValueID为空)

这样,您就可以在主表(
Orders
我想)中内联一定数量的常见特殊情况,并使用约束强制执行数据正确性。

您不应该简单地执行类似的操作吗

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


或者,您实际上需要对每个处方都有单独的失败原因?

这听起来像是我提到的“其他”解决方案中的第一个(这不是一件坏事)。不过,我认为可能存在一些混淆,因为
orderprocription
表是一个多表,而它又包含查找值id(
DrugId
)能够约束数据的想法很好,我认为这不是该方法的优势。(你是对的,我的初始表是
Orders
)根据最终解决方案的有用性选择的最佳答案。我最后放了一个代码(不是外键)进入Orders表,该表将提供诸如“无响应”、“当前”、“无”等信息。使用validaion代码以及预填充单选按钮选项,该操作非常容易。