我正在开发一个Web应用程序,该应用程序使用PHP作为其代码,并使用MySQL作为其存储引擎。在处理数据模型时,我意识到处理“默认”数据存在一个小问题。
我设计了MySQL模式以包含默认值,这在当时很有意义,因为我主要是“手动”操作数据-一年后,我们开始添加控制面板以允许其他人更改数据。
问题在于如何处理某些对象所需的“默认”值。从技术上讲,将内容保留为“ null”也是一种默认设置,但在此之前并不是我特别关注的一种。
如果使用MySQL默认值,则在插入新值时,我必须立即转过身并查询它,以从数据库中获取“真实”数据。另一方面,如果我在PHP中设置了默认值,则会在两个地方设置默认值,从而违反了DRY。而且,如果有人曾经做过“快速”修复并只在一个地方进行了更改,那么我可能会发现一些非常“有趣”的错误以进行调试。同时,我无法从MySQL中删除默认值,因为它实际上是数据模式的一部分,需要保留在其中。
我敢打赌我要么忽略某件事,要么在某处做出无效假设,但我不知道那是什么。有人对如何处理有任何建议吗?
编辑:
为了清楚起见,我的PHP代码可能类似于以下内容:
$foo = new foo();
//Add in instance-specific data
$foo -> save;
Foo的save方法将运行查询:
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吗?还是我错过了第四个更好的选择?
您没有向我们显示示例查询,但是我会假设有什么问题。
如果您以PHP方式编写插入查询,从而省略了具有默认值的元素,那么MySQL将接管并为您添加它们。
所以,说你有一个列的表 id
, user
和 comment
。假设它 comment
具有默认值。我的意思是,您可以进行插入查询,在其中只需指定 id
and user
(或 user
,如果 id
仅是主要的自动递增索引,则 可能仅 指定 ),并且the comment
将自动接收您在表中设置的默认值定义。
编辑
无论哪种方式,最适合您的应用程序设计的,实际上……查看它们将在哪里得到最充分的利用,并将其保留在那。
但是我要遵循的一条规则是:不要在多个地方使用默认值,尤其是在它们重叠(而不是扩展)的情况下。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句