我应该在哪里设置默认值?

时间:2013-08-10 17:51:07

标签: php mysql

我正在开发一个使用PHP代码的Web应用程序,以及用于它的存储引擎的MySQL。在处理我的数据模型时,我意识到处理“默认”数据时遇到了一个小问题。

我设计了MySQL模式以包含默认值,这在当时是有意义的,因为我主要是“手动”操纵数据 - 一年之后,我们开始添加一个控制面板让其他人更改数据

问题在于如何处理某些对象所需的“默认”值。从技术上讲,留下“空”的东西也是默认的,但在此之前它并不是特别关注我的。

如果我使用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。 E. G. bar3和bar4具有在首次创建对象时未设置的默认值 - 用户可以在以后更改它们(如果他们想要的话)(但可能会),但它们不是“默认”对象的一部分。

我应该将这些默认值移到PHP中吗?把它们留在MySQL中并退出它?将DRY放在两个地方都会违反DRY?或者我错过了第四个更好的选择?

1 个答案:

答案 0 :(得分:1)

您没有向我们展示示例查询,但我会假设出现了什么问题。

如果您在PHP中编写插入查询,省略了具有默认值的元素,MySQL将接管并为您添加它们。

因此,假设您有一个包含idusercomment列的表格。假设comment有一个默认值。我所说的是,如果id是主要内容,您可以在只指定useruser(或可能只是id的情况下进行插入查询,自动递增索引),comment将自动接收您在表定义中设置的默认值。

修改

无论什么最适合您的应用程序设计,真的......看看它们将在哪里使用最多并将它们保留在那里。

但我遵循的一条规则是:在多个地方没有默认值,特别是如果它们重叠(而不是扩展)