保持代码和数据库引用表中命名常量同步的最佳实践?

时间:2009-04-10 18:13:35

标签: database

通常最好的做法是使用命名常量代替幻数,但确保数据库引用表和命名常量文件保持同步非常繁琐且容易出错。是否有一些简单的方法可以保持这两个信息源同步,或者我是否忽略了明显的设计增强?

如果我的问题不明确,这是一个例子。我有一个包含2列的参考表:

UserStatus
----------
UserStatusID
UserStatus

因此,此表将UsersStatusID 1与UserStatus“Active”相关联。 User表依赖于此表来规范UserStatuses。

因此,当从代码查询用户状态时,我有两个选择:

SELECT UserStatusID FROM Users WHERE UserStatus = 1

OR

SELECT UserStatusID FROM Users WHERE UserStatus = ACTIVE_USER_STATUS_ID

最佳做法是使用后者,因此数字1的含义很清楚。但这意味着我必须在UserStatus表和我的代码中维护一个完整的有效UserStatusID列表。如何避免更新数据库引用表和常量文件?我正在使用一个集中的常量文件,所以我只需要为我的代码更新一个地方,但是有一种方法可以避免在引入新状态时根本不需要更新常量文件吗?

我有一个想法:安排一个脚本每天运行一次,通过查询db中的引用表来填充常量文件。这是最好的解决方案吗?

1 个答案:

答案 0 :(得分:3)

将常量保留在数据库中。根据需要查询它们。

如果性能有问题,那么在应用程序启动时将所有常量加载到内部数据结构中,然后在整个应用程序中使用它。

所以你的代码示例是:

SELECT UserStatusID
FROM Users 
WHERE UserStatus = (
                   SELECT INTEGER_VALUE
                   from DB_CONSTANTS
                   WHERE CONSTANT_ID = 'ACTIVE_USER_STATUS_ID'
                   )

或者,如果您使用内部结构,它将更像是这样:

SELECT UserStatusID
FROM Users 
WHERE UserStatus = g_Constants.ActiveUserStatusID;