【问题标题】:How to make schema and code dynamic?如何使模式和代码动态化?
【发布时间】:2011-06-02 10:07:20
【问题描述】:

我想让我的数据库架构和应用程序代码尽可能动态地处理“未知”用例和更改。使用 PHP 和 MySQL 进行开发。现在我不得不两次更改我的整个架构,包括表名和列名,这意味着开发人员必须返回应用程序代码并修改所有 SQL 查询和表/列名。因此,为了防止这种情况发生,我想像我们在页面内容、标题栏等动态的页面上做的那样,比如%variable%,我们可以为模式甚至php代码函数和类做这件事吗?像这样重新进行所有更改需要数周时间,而如果它是动态的,则可以在一天内完成。

【问题讨论】:

    标签: php database schema


    【解决方案1】:

    首先,祝您新年快乐(不管您的编码问题:))。现在,我要向您提出的建议几乎适用于任何开发语言,但我认为 PHP 受此影响最大的原因是缺乏 OO 开发。

    改变架构和函数的主要问题是架构的定义。要拥有一个健壮的架构,您应该:

    • 确定构成您的应用程序的类
    • 创建与这些类通信的接口
    • 从您的数据类中抽象出您的业务(域)类

    考虑使用(如果您还没有使用它)一个 ORM 框架来映射您的数据库,因为您使用的是 PHP,我建议您使用 PropelDoctrine,它们非常棒。谨防过度依赖您的 ORM 框架并将其转换为您的业务模型,您可以查看 this blog post 我就该主题进行的讨论。

    希望能帮上忙 大卫

    【讨论】:

      【解决方案2】:

      您处于什么发展阶段?你是在谈论重新设计还是只是重构名称等等?一些想法:

      1. 如果您处于开发的早期阶段,可能正在尝试了解设计的可能形成方式,那么重写您的概念验证应用程序是很自然的。

      2. 如果您在生产中,并且您的设计确实发生了变化(随着用户需求的成熟 - 它发生在现实生活中),那么您的旧应用程序现在肯定已经过时并且无论如何都必须重写。

      3. 如果您只是重命名,而不是真正重新设计,那么您真的需要这样做吗?不需要仅仅因为用户可见的术语发生变化而更新表和列、类和变量等内部事物的名称。

      基本上我的意思是,像您设想的动态设计让我觉得构建基础很差。

      但这并不是说您不能拥有灵活的设计。最简单的情况:将数据库规范化为大约第三范式通常会带来灵活性,因为您可以添加列、创建新关系等等。具有良好定义接口的小类也是如此。

      假设您想要一个强大的设计来构建您的系统,我建议您进行灵活的设计(艰苦的工作)并且不要寻找一键式解决方案。 (不知道我是否理解你的问题......?)

      【讨论】:

        【解决方案3】:

        您可以在所有脚本的开头包含一个特殊的 PHP 文件,该文件可以包含预定义的常量,您可以在整个代码中使用这些常量来代替所有表名和列名。然后,每当您需要更改表或列的名称时,您只需在这 1 个 PHP 文件中的 1 个位置进行更改。

        在此处查看有关常量的 PHP 文档:
        http://php.net/manual/en/language.constants.php

        如您所见,常量存在于全局范围内。这意味着它们可以毫无问题地在所有函数和所有类中使用。

        您可能已经知道“include”的使用(用于在所有脚本的开头加载特殊的 PHP 文件):
        http://php.net/manual/en/function.include.php

        因此,例如,如果您想使用动态表名和列名编写一些 SQL,您可以这样做:

        在constants.php里面:

        define("USER_TABLE",  "Users");
        define("NAME_COLUMN", "FirstName");
        

        在您的脚本中,您可以这样做:

        include "constants.php";
        ...
        $sql = "select " . NAME_COLUMN . " from " . USER_TABLE . " where id = ...(etc)";
        

        上面的意思是这样的:

        $sql = "select FirstName from Users where id = ...(etc)";
        

        如果以后想改表名和列名,只需要改constants.php文件即可。

        define("USER_TABLE",  "DifferentUsers");
        define("NAME_COLUMN", "DifferentFirstName");
        

        这将自动导致使用此包含文件的所有脚本发生变化。

        新的翻译结果现在看起来像:

        $sql = "select DifferentFirstName from DifferentUsers where id = ...(etc)";
        

        【讨论】:

        • 因此,读起来像“从用户表中选择名字”的查询实际上可能意味着“从公司中选择公司名称”。不,谢谢,我随时都会采用搜索、替换和重新测试的方法。
        • 这正是原发帖人说他想要避免的。我在这里提供了他想要的答案。此外,这里的其他答案需要更深入的时间和技能投资,并且可能意味着从头开始完全重做他的整个项目。尽管我同意在未来研究这些其他策略和架构是值得的。
        猜你喜欢
        • 1970-01-01
        • 2011-01-22
        • 1970-01-01
        • 1970-01-01
        • 2016-08-20
        • 2021-05-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多