データベースの整合性を強化する


19

これは、外部キー、チェック制約などを持たせる代わりに、アプリケーションにデータベースの整合性を強制することに意味があるでしょうか?

内部データベースツールを使用してデータベースの整合性を強制しない場合、パフォーマンスの向上はどの程度期待できますか?

回答:


24

実を言うと、データベースに外部キー制約があることでパフォーマンスが大幅に低下することはないだけでなく、パフォーマンスが向上することもわかります。SQL Serverクエリオプティマイザーは、主キーと外部キー、およびその他の種類のデータ制約の概念に基づいて構築されています。これらが適切に実施されている場合、オプティマイザーはそれらを利用してパフォーマンスを向上させることができます。以下に、実際の動作を示す簡単な例含むブログ投稿を示します。

本当に読み取りよりも多くの挿入があるエッジケースの場合(および更新と削除には読み取りが必要なため、通常は読み取りカウントに追加されます)、パフォーマンスのためにデータから制約を削除することは理にかなっているかもしれません。しかし、圧倒的多数のデータベースは読み取り指向であるため、パフォーマンスを犠牲にしており、パフォーマンスを向上させているわけではありません。

そして、コードですべての作業を行う場合と同様に、複数のアプリに対して複数回行う必要がある場合があるため、一度作成するだけでよいため、データベースでデータの整合性がより適切に処理されるという事実は言及されていませんデータアクセスレイヤーを慎重に設定し、すべてのアプリがdbにアクセスして同じレイヤーを通過する必要があります)。

リレーショナルデータベースシステムを使用している場合、実際に使用しないのはなぜでしょう。リレーショナルデータが必要ない場合は、Hadoopなどを使用してください。


2
これは、私が自分自身で考え、期待していたこととほぼ同じです。私は以前の仕事でDBAがそれについて間違っていることを知っていました。ありがとう!
Renats Stozkovs

17

多くのアプリケーション開発者はそう考えています。

データの整合性をアプリケーションコードに委任したい場合は、「このデータベースにヒットするすべてのプログラマーとすべてのアプリケーションが、いつでも完全に適切な状態にする必要がある」と考えてください。

オッズは何ですか?


5
+1。それは基本的にそれです。十分にテストされた中央システムを、大量のプログラマーが従わなければならない要求に置き換えます。毎回。発生しません-したがって、時間の経過とともに不良データを持つデータベースを取得します。
トムトム

13

パフォーマンスが向上したとしても、参照整合性と一般化されたデータ整合性が返されるのに比べると、無視できます。

データベースが無意味なデータストアである時代はもはや過ぎ去りました。RDBMSが提供する力を活用してください。

特にこのような小規模では、パフォーマンスの向上がすべてではありません。しかし、アプリケーションが強制するはずの想定される外部キー関係があることがわかり、それが参照テーブルの主キーではないことが判明した場合、パフォーマンスの向上についてはほとんど気にしません(もしあれば、その詳細については話さないでください)。


-1。人々がアプリケーションロジックをデータベースに配置する時代は過ぎ去りました。スタック全体の一部をスケーリングするのに最も困難でコストがかかります。私にとってデータベースは、アプリケーションによって実行されるロジックを備えたダンプストアです。言った:参照整合性は、データベースレベルの整合性に関するものであり、非常に便利です。
トムトム

5
@TomTomアプリケーションのデータ整合性ロジックの書き換えは、RDBMSですでに行われている作業をやり直します。データベースにデータロジックを保持します。
トーマスストリンガー

@TomTom-「理論的に無効なデータは決してデータベースにヒットしませんが、整合性は最後の防衛線です。」同意した。その派手なAJAXフォームは、入力を事前に検証することにより、エンドユーザーの頭痛を大幅に軽減します。同様に、これらのデータベースの制約により、時間と費用とエネルギーが無駄なコードの後に​​クリーンアップされるのと同じくらい、ビジネスとエンジニアを節約できます。
ニックチャマス

6

十分な量のデータロードを実行している場合は、制約(外部キー、CHECKなど)とインデックスを削除し、後で制約とインデックスを再度有効化/実装するのが一般的です。その検証には時間がかかります。これは、データベース固有のバルクロード構文を使用できないことを前提としています(ロギングの最小化を含む)。

予想されるパフォーマンスの向上の程度を言うことは不可能です-各状況は一意です(データ型、設計など)。本当に知る唯一の方法はテストすることです。


1
+1。ただし、これは特殊なケースであることに注意してください。一般に、データロードは処理を行わず、データが正しいと想定し、インデックスの再作成ステップでとにかく爆発します。これは、データウェアハウスレベルの技術です。
トムトム

3

制約が邪魔になる場合がいくつかあります。

  1. 単一テーブル継承(STI)を使用する必要がある場合。個人と組織の両方に販売していると想像してください。行が個人または組織のいずれかである単一の「パーティー」テーブルが必要です。STIは、nullであってはならないnull可能フィールドが必要であることを意味します。Class Table Inheritanceはこれを解決しますが、これはいくつかのORMにとってより困難です。たとえば、RubyのActiveRecordはSTIのみをサポートしています。

  2. エンティティのドラフトバージョンをサポートする必要がある場合、完全に有効ではない可能性があります。ドラフトをjsonとして保存することもできますが、クライアントで同じ識別子を再利用するのは難しくなります。id= 5で保存され、無効になるように編集され、draftid = 99として自動保存されます。この場合、すべてのフィールドはおそらくnull入力可能にする必要があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.