0

私のデータベースには、ほぼ 300 万の金融取引記録があります。これらのレコードは、テーブルの列にマップされる次のフィールドを含む外部ファイルからロードされます。

Account, Date, Amount, Particulars/Description/Details/Narration

現在、すでにロードされているレコードと将来のレコードの一意性を維持する必要があります。

既にロードされている外部ファイルには一意性がなかったので、与えられたフィールドを使用して一意のキーを作成して既存のレコードを更新する必要があると思いますが、外部ファイルのフィールドが重複する可能性があることは明らかです。

ファイルからトランザクションを識別できるような一意性を維持する方法は既にロードされています。あらゆる種類の提案を歓迎します。

編集 1

現在ロードされているレコードは有効であることが確認されています。古いファイルまたは欠落しているファイルからいくつかの欠落したレコードがロードされたため、一意性を維持する必要性が生じました。

編集 2

既存のレコードには、指定された 4 つのフィールド、つまり 2 つ以上の有効なトランザクションの Account、Date、Amount、および Particulars の同じ値に基づいて重複レコードが含まれる場合がありますが、これらのレコードは重複値があっても有効であることが確実です。

欠落しているレコードをロードするために、すでにロードされているレコードをロードしないように、レコードがすでにロードされているかどうかを識別する必要があります。そのため、これらのフィールドに基づいてレコードが既に読み込まれているかどうかを知るのは非常に難しいようです。これらの分野の限界を超えていると思います

編集 3

現在、状況は変化しており、これはもはや有効な質問ではありませんが、他の人のためにここに残しておく方がよいでしょう. レコードに一意のキーを追加することが合意されているため、このキーに対して重複をチェックします

4

3 に答える 3

1

「既存のレコードには、指定された 4 つのフィールド、つまり 2 つ以上の有効なトランザクションのアカウント、日付、金額、詳細の同じ値に基づいて重複レコードがある場合がありますが、これらのレコードは重複値があっても有効です。」

しかし、ロードされたデータまたはソース ファイルに一意性のトークンがない場合、どうすればわかりますか? 有効性とはどういう意味ですか?

「失われたレコードをロードするために、すでにロードされているレコードをロードしないように、レコードがすでにロードされているかどうかを識別する必要があります。」

一意性の既存のソースがなければ、これを行うことはできません。の特定の組み合わせに対して 2 つの行が(Account, Date, Amount, Particulars)あり、それで問題ないため、(Account、Date、Amount、Particulars) の 3 番目のインスタンスが既に読み込まれているレコードであると判断するためのルールは何ですか?これはロードされていないため、有効です。

「ですから、私には、これらのフィールドに基づいてレコードがすでに読み込まれているかどうかを知るのは非常に難しいように見えます。これらのフィールドの制限を超えていると思います。」

あなたが説明したように、データには解決策が見つからないと言っても過言ではありません。しかし、解決策は実際には非常に簡単です。ロードされたレコードの有効性を主張した人々のところに行き、これらの追加レコードのリストを提示します。彼らはスキルと判断力を駆使して、どのレコードが有効かを教えてくれるので、あなたはそれらをロードします。


「解決策を見つけるのが私の義務です」

いいえ、それはあなたの義務ではありません。現在、データ セットを正確に定義する義務はデータ所有者の肩にかかっており、これにはビジネス キーの特定が含まれます。彼らは責任を放棄している人です。

このような状況では、次の 3 つの選択肢があります。

  1. データ所有者が義務を果たすまで、それ以上のレコードの読み込みを拒否します。
  2. ロードのために提示されたすべてのレコードを、検証なしでロードします。
  3. ひどい NOVALIDATE 構文を使用してください。

NOVALIDATE は、将来の行に検証規則を適用する方法ですが、既存のデータの違反は無視します。基本的に、これは政治的な問題に対する技術的なクラッジです。

SQL> select * from t23
     /

      COL1 COL2
---------- --------------------
         1 MR KNOX
         1 MR KNOX
         2 FOX IN SOCKS
         2 FOX IN SOCKS


SQL> create index t23_idx on t23(col1,col2)
     /

Index created.

SQL> alter table t23 add constraint t23_uk 
          unique (col1,col2) novalidate
     /

Table altered.

SQL> insert into t23 values (2, 'FOX IN SOCKS')
      /

insert into t23 values (2, 'FOX IN SOCKS')
*
ERROR at line 1:
ORA-00001: unique constraint (APC.T23_UK) violated

SQL> 

制約を追加する前に、一意でないインデックスを事前に作成する必要があることに注意してください。そうしないと、データベースは一意のインデックスを作成し、NOVALIDATE 句をオーバーライドします。

私は NOVALIDATE を恐ろしいと表現しています。データの破損をデータベースに焼き付けます。しかし、それは解決に最も近いものです。

このアプローチは、「有効性」の概念を完全に無視しています。そのため、「有効な」 n 番目の (Account, Date, Amount, Particulars). これは避けられません。良いニュースは、有効性を確立するための定義された規則がないため、だれにもわからないということです。

どのオプションを選択する場合でも、上司、データ所有者、データ所有者の上司、および適切と思われるその他の人物に明確に説明し、先に進むための書面による同意を得ることが重要です。そうしないと、いずれデータベースが重複した行でいっぱいになっていることに人々が気付くか、誰かが「有効な」レコードがロードされていないと文句を言うでしょう。適切なトップブラスからの許可を得て紙。

幸運を


MERGE を使用するという Haki の提案は、NOVALIDATE と同じ効果があります。これは、新しいレコードが読み込まれ、すべての重複が抑制されるためです。ただし、これはさらにお粗末です。一意性の概念についてはまったく触れていません。INSERT または UPDATE アクセス権を持っていた人は、好きな行を持つことができます。したがって、このアプローチは、そのテーブルに対する権限を完全にロックダウンして、そのデータを MERGE を介してのみ操作でき、他の DML を操作できない場合にのみ機能します。継続的な一意性が重要かどうかによって異なります。繰り返しますが、ビジネス上の決定です。

于 2013-07-09T07:40:31.407 に答える
0

アップサートが必要なようです-またはオラクルがそれを呼び出しますMERGE

MERGE2 つのテーブル間の操作により、次の 2 つの一般的な状況を処理できます。

  1. レコードは既にターゲット テーブルに存在しており、何かを行う必要があります。更新するか、何もしません。

  2. レコードがターゲット テーブルに存在しません - 挿入してください。

于 2013-07-09T07:44:14.273 に答える