我应该把“无”放入查询表吗?

时间:2012-08-23 15:27:47

标签: database-design lookup-tables

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

真实情景:

查询表是一般药品名称列表,包含用于加入与我们的应用程序分开的其他数据库的代码。

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

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

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

  • 似乎在我们想要消费数据的每种情况下,我们都记得要考虑到这一点(除了一些小的例外,因为作为第三方数据库的内部加入。)
  • 对于任何进入该项目的人来说,这似乎都是非常明显的(更不用说屁股上的痛苦了),必须进行独特的测试。也许单独使用“无”做这件事并不是那么糟糕,但是我们想要将“拒绝”或“不知道”添加到组合中呢?现在,我们的查找表中有3个非明显的例外情况,每次访问数据时都必须考虑这些例外情况。
  • 我们要么将当前所需的字段设为可为空,要么将虚假数据插入其中。

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

  • 在订单中添加一个新列,其中包含“有处方”,“已拒绝”,“无处方”等选项。这是不可取的,因为成千上万的行将为“空”,但在其他方面似乎并不太糟糕。

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

SO社区的想法?

2 个答案:

答案 0 :(得分:1)

你不应该只是这样做吗?

enter image description here

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

或者,您实际上需要为每个处方单独设置失败原因吗?

答案 1 :(得分: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)中,并使用约束强制执行数据正确性。