常量包含大量规范化数据库的最佳实践

时间:2015-02-18 13:49:55

标签: sql oracle constants

我有一个非常规范化的Oracle数据库。它有许多大表,可能还有20个或更多非常小的表(< 10条记录)。

例如,有一个状态表。为了了解其中的数据,它看起来像这样:

ID    Status
1     Cancelled
2     In Progress
3     Completed

目前,在整个代码中都有可怕的幻数引用,如下所示:

SELECT *
FROM   [somewhere]
WHERE  [something] = (
         SELECT Status
         FROM   [StatusTable]
         WHERE  Id = 2
       )

我讨厌这些随机数,更倾向于用常数替换它们。

我最初的想法是一个常量包。在那里,我可以有一个全局变量2,它返回正确的状态。它在一个地方解决了问题 - 除了当然它使得表格过时并且没有从表格中获取信息。

这里的最佳实践解决方案是什么?我喜欢这些常数。我认为它们在代码中更加清晰,即:

SELECT Status
FROM   [StatusTable]
WHERE  Id = CONSTANTS.Status_In_Progress

但是,我担心表数据没有附件。

2 个答案:

答案 0 :(得分:1)

如果要更改某些内容,请更改为连接到包含单词值而不是int的表。否则,您的问题是将常量数据与实际值保持同步,因为这些值可能会不时发生变化。可能会添加更多内容,文本值可能会更改。因此,您已经在规范化数据库中加入了一些内容来获取这些值。用它。至少那时你没有让Constants保持同步的额外问题。

然而,即便如此,也可能会发生变化。并且比使用魔术数字查找值会导致更多问题。

假设您在表中有状态列表,状态ID 2的状态为“InProgress”,后来有人将其修复为“进行中”,您是否要更改代码,因为文本已更新?假设你有一个clientid?公司名称经常更改。实际上,在使用查找时,我实际上已经看到了尝试使用冗余的问题而不是幻数。

现在我告诉你,魔术数字处理起来并不好玩,但要小心改变它们并引入新的bug,特别是如果查找的文本值可能会发生变化(比如客户名称“Sears,Inc”)可能会成为'Sears and Roebuck,Inc。')。状态名称不太可能改变的查找可以被他们的verbage引用,但这需要在查询表中添加一个你当前在查询中没有的联接。更多的连接可以开始为查询添加一些处理时间。它可能会改变数据库用于查找数据的计划,然后突然使查询意外地变慢。添加所需的连接是一件好事,添加一个你可能不是一个快速查询和陷入困境之间的断点(当然,在大多数情况下它可能不会添加任何可衡量的东西)。无论何时你改变代码,你都会引入新bug或者改变表现。

现在您还必须考虑为此系统编写代码的其他开发人员。如果每个人都知道statusid 10是“完整的”,他们可能会继续使用这种类型的代码而你正在打一场失败的战斗。对于使用组织已经使用的标准而不是根据您的偏好进行任意更改,可以说些什么。

答案 1 :(得分:0)

从我多年设计PL / SQL应用程序的经验中我可以看出,没有比你建议的更好的方法(主要是在代码可读性和维护性方面),即将这些常量存储在单独的包规范和引用中他们在查询和/或其他处理中。

而不是从表数据中分离出来,我会把它想象成一种"界面"数据。

但是,让我提出另一点:从现在开始,您可以从新代码或由于更改请求重写的代码开始,但是为了重写现有的,经过测试的生产运行代码,因为"我不喜欢#39; t喜欢它的样子"是非常弱的原因,在应用程序功能方面没有附加价值,但是导入错误的风险非零......我宁愿换另一杯咖啡或回复新的SO问题而不是这样的工作。