使用常量定义表和列名称

时间:2014-08-22 15:32:10

标签: php mysql

使用常量定义所有表名和列名然后在查询字符串中使用它们是一种很好的编码风格吗? 我这样做,因为每当我在数据库中更改某些内容时,我只需更改常量而不是更改所有内容。 例如,这是我在单独文件中的数据库定义:

    define("DB_TBL_USER", "user");

    define("DB_USER__PK_USER_ID", "pk_user_id");
    define("DB_USER__PASSWORD", "password");
    define("DB_USER__EMAIL", "email");
    define("DB_USER__FIRST_NAME", "first_name");
    define("DB_USER__LAST_NAME", "last_name");
    define("DB_USER__GENDER", "gender");

在我的数据库类中我构建了这样的查询(在register_user()方法中!):

$queries[]="INSERT INTO ".
                            constant('DB_TBL_USER'). " ( ".
                            constant('DB_USER__PASSWORD').",".
                            constant('DB_USER__EMAIL').",".
                            constant('DB_USER__FIRST_NAME').",".
                            constant('DB_USER__LAST_NAME').",".
                            constant('DB_USER__GENDER').") ".
                        "VALUES ("."
                            $password, 
                            $email, 
                            $first_name, 
                            $last_name, 
                            $gender
                            ";

然后将其他查询放在queries []数组中并使用循环执行它们。

有没有更简单,更有效的方法呢?

1 个答案:

答案 0 :(得分:3)

实际上,重命名专栏并不经常发生。添加或删除它们更为常见,为此你的常量不会有帮助。

列更改的主要原因是,当其含义发生更改时,例如,当您要存储首字母而不是名字时,可以将列first_name重命名为initials

但是,如果你有一个常量,你仍然需要重命名常量,否则你会有一个无意义和混乱的常量名称。

它可能仍然会更容易,因为DB_USER__FIRST_NAME可以在代码中找到比first_name更容易找到的内容(这可能会导致变量名等的误报)。

无论如何:如果你这样做,我会使用名为DB_TBL_USER而不是constant('DB_TBL_USER')的常量。如果这样做,您的代码就会更精简,您可以从IDE中的代码完成功能中受益。

如果您没有,并且在非常罕见的情况下需要重命名first_name,您仍然可以搜索整个代码并检查每个匹配是否需要更改。即使在非常大的项目中,这也是可以管理的。

或者,您可以考虑将表名添加为列名称的前缀,因此将列命名为user_first_name而不是first_name。不是我会选择的路径,但它有时会完成(例如,MediaWiki使用此模式)。

如果使用ORM和/或命令模式,则可以在少数几个小类中包装对表的访问,从而使更改列名变得微不足道。如果您有一个合适的IDE,则可以通过重构工具重命名映射到该列的属性,否则将应用与上述相同的搜索/替换注释。