代码之家  ›  专栏  ›  技术社区  ›  Cory House

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

  •  4
  • Cory House  · 技术社区  · 16 年前

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

    如果我的问题不清楚,这里有一个例子。我有一个包含两列的引用表:

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

    因此,此表将usersstatusid 1与userstatus“active”关联。用户表依赖此表来规范化用户状态。

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

    SELECT UserStatusID FROM Users WHERE UserStatus = 1
    

    SELECT UserStatusID FROM Users WHERE UserStatus = ACTIVE_USER_STATUS_ID
    

    最好的做法是使用后者,这样数字1的含义就很清楚了。但这意味着我必须在我的userstatus表和代码中维护一个完整的有效userstatusid列表。如何避免必须同时更新db引用表和常量文件?我使用的是一个集中的常量文件,所以只有一个地方需要更新我的代码,但是有没有一种方法可以避免在引入新状态时更新常量文件?

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

    1 回复  |  直到 16 年前
        1
  •  3
  •   JosephStyons    16 年前

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

    如果性能有问题,则加载 全部的 将应用程序启动时的常量转换为内部数据结构,然后在整个应用程序中使用该结构。

    所以您的代码示例是:

    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;