1

ほとんど非正規化された既存のテーブルがあります。リストのステータス、タイプ、国などのルックアップ テーブルはありません。この元の設計は、データベースへのアプリケーションのアクセスを簡素化するためだけに行われたため、この非正規化にはパフォーマンス上の理由はありませんでした。

これにより、大量の重複データを含むテーブルが作成されました。さまざまなステータス/タイプ/国列のルックアップ テーブルを導入して、適切に正規化したいと考えています。

クライアントに対して透過的なままであるデータベース (oracle) でこれを行うことができるものはありますか? アプリケーションは引き続き挿入を行いますが、データベースはバックグラウンドで物事を適切なルックアップ テーブルにマップします。

私は、マッピングを行うビューとトリガーの組み合わせを実験してきましたが、これを行うためのより自動的な方法があるべきだと感じています。

4

1 に答える 1

7

一般に、更新可能なビューを作成できれば、変更をユーザーに対して透過的にすることができます。

  1. ベース テーブルを 3NF、BCNF、または 5NF に正規化します。
  2. 元のベース テーブルの名前を変更します。
  3. 元の非正規化ベース テーブルと同じ名前、列、および行を持つ更新可能なビューを構築します。
  4. 新しいビューのアクセス許可が、元のベース テーブルのアクセス許可と相関していることを確認してください。
  5. テスト。
  6. 完了するまで繰り返します。

元のベース テーブルを SELECT、INSERT、UPDATE、または DELETE しようとするクライアント ソフトウェアは、代わりに更新可能なビューをヒットします。(これは、テーブルとビューが名前空間を共有しているためであり、これは偶然ではありません。) dbms とサポート コードにより、適切な処理が確実に実行されます。

プラットフォームと分解によっては、更新可能なビューを構築するのは簡単かもしれませんし、不可能かもしれません。Oracle では、最悪のケースは、すべてのクエリ操作をサポートするために INSTEAD OF トリガーを作成する必要があることだと思います。それはそれほど悪くはありません。

しかし、数か月間 SO をたたき回したことに基づいて、あなたが本当にこれを行う必要がある、または本当にこれをやりたいと 100% 確信しているわけではないと言わざるを得ません。テーブルの DDL と代表的なサンプル データを SQL INSERT ステートメントとして投稿してください。より適切で具体的な提案を提供できます。

于 2011-07-15T18:59:10.237 に答える