簡単な答え:
- 参照整合性は必須です
- キャッシングは資格があります
- トリガーは持っているといいです
長い答え
私は1993年からリレーショナルデータベース(あなたが尋ねてから12月のRDB、それ以前はフラットファイルシステム)でアプリケーションを開発してきました。トリガーは「削除したくないものを削除できる」ため、多くの開発者に人気がありませんでした。参照整合性は、適切な参照整合性を備えた第3正規形のデータベースを数分でまとめることが難しいため、開発者からもしばしば眉をひそめられます。
理由はわかりませんが、キャッシングも正しく行うのが非常に「難しい」と見なされることがよくあります。
多くのシステムはトリガーなしで動作できますが、参照整合性がないと快適に存続できるアプリケーションデータベースはないと思います。この質問のタグを見てください。このサイトの背後にあるデータベースには、タグ(おそらく「タグ」と呼ばれる)と質問(おそらく「質問」と呼ばれる)のテーブルがあります。「質問」には、タグテーブルの主キーへの外部キーがありますが、質問には多くのタグが含まれる可能性があり、タグには多くの質問が含まれる可能性があるため、関係は次のようになります。
Question
(TagId) 1 | Database triggers / referential integrity and in-memory caching
|
-----
| | |
QuestionTag
(QuestionId) 1 | 1 ... 1 | 2 ... 1 | 3 ...
(TagId)
| | |
-----
|
Tag 1 | database ... 2 | referential-integrity ... 3 | triggers ...
(TagId)
この種の参照整合性は、信頼できるアプリケーションの基盤であり、交渉することはできません。これにより、アプリケーション設計の信頼性とその寿命に対する信頼性がどのように向上するかがわかります。
SOのキャッシュは、タグなどでオンになっている可能性があります(ただし、保証されていません)。そのため、タグがメモリにキャッシュされ、SOにタグを追加できる十分なレピュテーションがあると想定します。タグを追加すると、すぐにデータベースに保持される可能性がありますが、キャッシュは更新されますか?
あなたが持っているのはトレードオフです。新しいタグを知らなくてもサイトは存続できますか?もしそうなら、どのくらいの期間ですか?基本的に、タグがユーザーによって追加されてからデータベースに追加され、他のユーザーが使用できるようになり、他のユーザーが使用するようになると、タグのライフサイクルはどのようになりますか?キャッシュは、開発チームによって設定されたルールに従って再構築されます。そのルールは本質的にトレードオフになるため、アプリケーションの速度を低下させることなく、新しいタグをすぐに利用できます。
トリガーは参照整合性を強制できます。たとえば、追加するタグは「ごみ」ですが、管理者がそれを確認するまでに、3つの質問に「ごみ」のタグが付けられます。次に、管理者は「ごみ」タグを削除することを決定しますが、タグ付けされた質問についてはどうでしょうか。削除時に起動される「タグ」テーブルにトリガーがある場合、「質問」テーブルを実行して、「ごみ」へのすべての参照を削除できます。このアプローチには多くの代替案があり、その多くはプログラムによる回避策ですが、よりクリーンな代替案はありますか?
私は過去20年間に多くのサイトで作業してきましたが、優れたサイトは参照整合性とますますキャッシュを使用しています。データを匿名で変更するトリガー(基本的にはイベント駆動型のストアドプロシージャ)は一般的ではなく、ますます誤解されていますが、それでも役割があります。
キャッシングと参照整合性はどちらかと見なすことはできません-または-開発チームは、両方を組み込むことができるようにアプリケーションを設計する必要があります。