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

Cor*_*use 5 database

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

如果我的问题不清楚,这里有一个例子。我有一个包含 2 列的参考表:

UserStatus
----------
UserStatusID
UserStatus
Run Code Online (Sandbox Code Playgroud)

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

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

SELECT UserStatusID FROM Users WHERE UserStatus = 1
Run Code Online (Sandbox Code Playgroud)

或者

SELECT UserStatusID FROM Users WHERE UserStatus = ACTIVE_USER_STATUS_ID
Run Code Online (Sandbox Code Playgroud)

最佳实践是使用后者,这样数字 1 的含义就很清楚了。但这意味着我必须在 UserStatus 表和代码中维护有效 UserStatusID 的完整列表。如何避免必须更新数据库引用表和常量文件?我使用的是集中式常量文件,因此只有 1 个位置需要更新代码,但是有没有办法在引入新状态时完全避免更新常量文件?

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

Jos*_*ons 3

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

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

所以你的代码示例将是:

SELECT UserStatusID
FROM Users 
WHERE UserStatus = (
                   SELECT INTEGER_VALUE
                   from DB_CONSTANTS
                   WHERE CONSTANT_ID = 'ACTIVE_USER_STATUS_ID'
                   )
Run Code Online (Sandbox Code Playgroud)

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

SELECT UserStatusID
FROM Users 
WHERE UserStatus = g_Constants.ActiveUserStatusID;
Run Code Online (Sandbox Code Playgroud)