我想让我的数据库架构和应用程序代码尽可能动态,以处理“未知”用例和更改。用PHP和MySQL开发。现在两次我不得不改变我的整个架构,包括表名和列名,这意味着开发人员必须返回应用程序代码并修改所有SQL查询和表/列名称。所以为了防止这种情况,我希望如果我们在页面内容,标题栏等动态像%变量%的页面上这样做,我们可以为模式执行它,甚至可能用于PHP代码函数和类吗?重新做这样的所有更改需要几周时间,如果它是动态的,可以在一天内完成。
答案 0 :(得分:2)
首先,祝你新年快乐(无论你的编码问题如何:))。现在,我要提出的几乎适用于任何开发语言,但我认为由于缺乏OO开发,PHP受此影响最大。
changin架构和函数的主要问题是架构的定义。要拥有健壮的架构,您应该:
考虑使用(如果你还没有使用它)一个用于映射数据库的ORM框架,因为你使用PHP,我会建议Propel或Doctrine,这很棒。谨防过度依赖您的ORM框架并将其转换为您的商业模式,您可以查看this blog post我就此主题进行了讨论。
希望我能提供帮助, 大卫
答案 1 :(得分:2)
您可以在所有脚本的开头包含一个特殊的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)";
答案 2 :(得分:2)
你在哪个发展阶段?你在谈论重新设计或只是重构名称等等吗?一些想法:
如果您处于开发的早期阶段,或许可以四处寻找设计可能如何形成的感觉,那么重写您的概念验证应用程序是很自然的。
< / LI>如果您正在制作中,并且您的设计确实已经发生变化(随着用户要求的成熟 - 它会在现实生活中发生)那么您的旧应用程序现在肯定已经过时了,无论如何都必须重写。
如果您只是重命名,而不是真正重新设计,那么您真的需要这样做吗?由于用户可见的术语发生了变化,因此不需要更新表格和列以及类和变量等内部事物的名称。
基本上我是说像你设想的动态设计让我觉得它是一个不好的基础。
但这并不是说你不能拥有灵活的设计。最简单的情况:将数据库规范化为大约第三范式通常会产生灵活性,因为您可以添加列,创建新关系等。具有良好定义的接口的小类也是如此。
假设你想要一个强大的设计来构建你的系统,我建议你做一个灵活的设计(努力工作),而不是寻找按钮解决方案。 (我想知道我是否理解你的问题......?)