2

私は既存の巨大な注文管理アプリケーションを持っています。

ここで、メインの ORDER テーブルに、新しい列 IS_HISTORICAL を追加しています。値が TRUE の場合、注文は現在履歴にあり、アプリケーションに表示されないことを意味します。

ここで、IS_HISTORICAL が「FALSE」である注文のみを選択するように、既存のアプリケーションで多くの SQL クエリを変更する必要があります。つまり、WHERE 句に以下を追加します。

  AND IS_HISTORICAL='FALSE'

質問: *もっと簡単な方法はありますか? (過去の注文を非表示にするために) 非常に多くのアプリケーション クエリを変更する必要はありませんか?
基本的に、IS_HISTORICAL='TRUE' としてマークされたすべての ORDERS は、非表示/読み取り/更新に使用できなくなります!!*

注:現在、テーブルのサイズはそれほど大きくありませんが、最終的には IS_HISTORICAL true/false でテーブルを分割するつもりです。

4

3 に答える 3

3

分析に履歴データのみを使用する場合は、クエリごとに確認する必要があるデータの量が少なくて済むため、Florin のソリューションをお勧めします。UNION ALL が必要なため、分析クエリがより困難になりますが、他のすべては「より速く」実行されます (目立たない場合があります)。

一部のアプリケーション/ユーザーが履歴データへのアクセスを必要とする場合、より良い解決策は、テーブルの名前を変更し、必要なクエリを使用してその上にビューを作成することです。

すべてのクエリを書き直すことの問題は、現在または将来、1 つを忘れたり、1 つ間違ったりすることです。クエリが静的であるため、ビューはその問題を取り除きます。ビューをクエリするたびに、必要な追加条件が自動的に追加されます。

何かのようなもの:

rename orders to order_history;

create or replace view orders as
  select *
    from order_history
   where is_historical = 'FALSE';

さらに2点。

  1. TRUE/は気にしませんFALSE。テーブルが大きくなると、スキャンするデータが大量になります。列を VARCHAR2(1) として作成し、T/FまたはY/を使用しますN。これらはすぐにわかりますが、小さいです。または、 NUMBER(1,0) および1/を使用し0ます。
  2. IS_HISTORICAL 列が選択した値のみを持つことができるように、テーブルに制約を設定することを忘れないでください。

    2 つの値しか持たない場合は、CHECK CONSTRAINTを検討することをお勧めします。

    alter table order_history 
      add constraint chk_order_history_historical
    check ( is_historical in ('T','F') );
    

    それ以外の場合は、とにかくこれを行う必要があります。 FOREIGN KEY CONSTRAINTを使用してください。追加のテーブル ORDER_HISTORY_TYPES を定義します。

    create table order_history_types ( 
         id varchar2(1)
       , description varchar2(4000)
       , constraint pk_order_history_types primary key (id)
         );
    

    値を入力してから、外部キーを追加します。

    alter table order_history 
       add constraint fk_order_history_historical
    foreign key (is_historical)
    references order_history_types (id)
    
于 2013-02-18T08:52:27.547 に答える
2

Virtual Private Database/row-level security の使用を検討できます。is_historical = 'FALSE'これは、特定の条件が満たされたときに述語を自動的に追加するために使用できます(たとえば、アプリケーション ユーザーとして接続している場合など)。

于 2013-02-18T09:03:45.937 に答える
0

ユーザーが非履歴レコードのみを必要とする場合、オプションは ORDER_HIST テーブルを作成し、そこに履歴レコードを移動することです。(削除して挿入)

一部のユーザー/アプリケーションが両方のタイプのレコードを必要とする場合は、パーティション アプローチが最適です。

于 2013-02-18T08:41:03.583 に答える