我正在开发一个 web 应用程序,它使用 PHP 作为代码,使用 MySQL 作为存储引擎。在处理我的数据模型时,我意识到我在处理“默认”数据方面存在一个小问题。
我设计了 MySQL 模式以包含默认值,这在当时是有意义的,因为我主要是“手动”操作数据——一年后,我们开始添加一个控制面板来让其他人更改数据。
问题变成了如何处理某些对象所需的“默认”值。从技术上讲,将事物保留为“null”也是一种默认设置,但在此之前我并不特别担心它。
如果我使用 MySQL 默认值,当我插入一个新值时,我必须立即转身并查询它以从数据库中获取“真实”数据。另一方面,如果我在 PHP 中设置默认值,我会在两个地方设置默认值,从而开始违反 DRY。如果有人做了“快速”修复并在一个地方更改它们,我可能会发现一些非常“有趣”的错误来调试。同时,我不能从 MySQL 中删除默认值,因为它们确实是数据模式的一部分,需要保留在其中。
我愿意打赌我要么忽略了某些东西,要么在某处做出了无效的假设,但我不知道它是什么。有人对如何处理这个有任何建议吗?
编辑:
为清楚起见,我的 PHP 代码可能类似于:
$foo = new foo();
//Add in instance-specific data
$foo -> save;
然后 Foo 的保存方法将运行查询:
INSERT INTO FOO (bar1, bar2)
VALUES (:bar1, :bar2)
但这只会插入 Foo 使用的(许多)变量中的 2 个。所有这些都是将我设置为“默认”状态。目前,我必须运行:
$foo= Foo::getFooWithId($foo->id); //I know I should use a DBA; this is legacy code
然后 $foo 会填充数据库中设置的数据。EG bar3 和 bar4 具有在首次创建对象时未设置的默认值——用户可以稍后更改它们,如果他们愿意(并且可能会),但它们不是“默认”对象的一部分。
我应该将这些默认值移到 PHP 中吗?将它们留在 MySQL 中并退出?通过将它们放在两个地方来违反 DRY?还是我错过了第四个更好的选择?