0

バックグラウンド

データにSQLiteDBを使用するプロジェクトがいくつかあります。データベースに保存されているデータは、明らかにキー/外部キー値によってリンクされた複数のテーブルに保存されています。

これらのデータベースでは、1つのレコードに何かが変更された場合、他のいくつかのテーブルを更新する必要があります。私の頭から離れた最良の例は、レコードを削除することです。削除するレコードに関連する他のすべてのレコードも削除する必要があります。さて、この例はキー/外部キー値を使用して解決できると思いますが、より複雑な更新についてはどうでしょうか?

現在、私はプロのDB管理者ではありませんが、DBにデータの整合性が必要であるか、状況が醜くなることはわかっています。

質問

だから、私の質問。プログラムで関連するテーブルを更新するときは、より細かく制御できることを知っていますが、人的エラーと時間が犠牲になります。何かを見逃したり、テーブルの更新を正しく実装しなかったりする可能性があり、更新のコーディングにかなり時間がかかります。一方、トリガーを入れてDBに他のテーブルの更新を処理させることはできますが、そうすると多くの制御が失われます。

それで、どちらが良いですか?それぞれが異なる状況で優れていますか?

4

1 に答える 1

1

一方、トリガーを入れてDBに他のテーブルの更新を処理させることはできますが、そうすると多くの制御が失われます。

どのようなコントロールを失っていると思いますか?データの整合性が「ここでのそのような更新にはあちこちで追加の更新必要」である必要がある場合、それをトリガーにコーディングすることで制御を失うことはありません。制御を一元化し、それをdbmsに委任します。これは、すべてのアプリケーションがこれらの要件に従うことを保証できる唯一のソフトウェアです。

プログラムで関連するテーブルを更新するときは、より細かく制御できることを知っていますが、人的エラーと時間が犠牲になります。何かを見逃したり、テーブルの更新を正しく実装しなかったりする可能性があり、更新のコーディングにかなり時間がかかります。

あなたはデータベース設計者ではなく、プログラマーのように考えています。(これは観察であり、批判ではありません。)「何かが恋しいかもしれない」とは思わないでください。その考え方は本当にマークを外しています。

代わりに、データの整合性をアプリケーションコードに委任したい場合は、「すべてのプログラマーと、このデータベースにアクセスするすべての新規または変更されたアプリケーションは、今から時間の終わりまで完全に正しくなる必要があります」と考えてください。

さて、正直なところ、それはあなたにとって本当に良い考えのように聞こえますか?

(私が働いていた最後のフォーチュン500企業には、OLTPデータベースにアクセスする少なくとも20の異なる言語で書かれたプログラムがありました。)

于 2011-03-15T22:31:50.730 に答える