コードに PHP を使用し、ストレージ エンジンに MySQL を使用する Web アプリケーションに取り組んでいます。データ モデルに取り組んでいるときに、「デフォルト」データの処理に小さな問題があることに気付きました。
私は、MySQL スキーマをデフォルトを含むように設計しました。当時は、データを「手で」操作していたので、これは理にかなっています。1 年後、他のユーザーがデータを変更できるようにコントロール パネルを追加するようになりました。
問題は、一部のオブジェクトに必要な「デフォルト」値を処理する方法になります。技術的には、「null」のままにすることもデフォルトですが、これまで特に気にすることはありませんでした。
MySQL のデフォルトを使用すると、新しい値を挿入するときに、すぐに向きを変えてクエリを実行し、データベースから「実際の」データを取得する必要があります。一方、PHP でデフォルトを設定すると、2 つの場所にデフォルトを設定することで DRY に違反し始めます。また、誰かが「簡単な」修正を行って 1 か所だけ変更した場合、かなり「興味深い」バグをデバッグすることになる可能性があります。同時に、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 に違反しますか? それとも、4 番目のより良いオプションがありませんか?