2

我正在开发一个 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?还是我错过了第四个更好的选择?

4

1 回答 1

1

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

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

因此,假设您有一个包含列iduser的表comment。假设它comment有一个默认值。我要说的是,您可以进行插入查询,您只需指定idand user(或者可能只是user,如果id是主要的自动递增索引),并且comment将自动接收您在表中设置的默认值定义。

编辑

无论哪种方式最适合您的应用程序设计,真的……看看它们在哪里被使用得最多,并将它们留在那里。

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

于 2013-08-10T17:56:30.550 回答