私の問題を説明する前に、いくつかのことを整理したいと思います。
- 私は経験豊富な (専門家ではありませんが) データベース設計者です。リレーショナル モデルについてよく理解できたと思います。
- 私は、あらゆる状況で何をすべきかを正確に知っているほど、リレーショナル モデルをしっかりと理解しているわけではありません。まだ勉強してる。
月に 1 回銀行から Excel スプレッドシートを受け取るとしますが、常に同じ銀行からではありません。スプレッドシートには、銀行名、口座番号、口座残高、顧客 (口座名義人) の名前、顧客の SSN、口座名義人の住所の 6 つの列しかありません。各行には異なる口座番号があり、口座番号は複数の行に記載されていません。このスプレッドシートをデータベースにインポートして、将来いつでも「2010 年 10 月 13 日のジョン スミスの住所は?」と尋ねたいと考えています。
簡単にするために、すべての顧客が 1 つのアドレスしか持たず、すべての顧客が 0 個以上のアカウントを持つことができるとしましょう。少しの間、Excel シートのインポートを 1 回だけ行う必要があると仮定しましょう。これはばかげた前提ですが、ご了承ください。その場合は、次の設計で十分です。
bank
--------
id
name
account
--------
id
bank_id
customer_id
number
balance
customer
--------
id
name
ssn
address
city
state_id
zip
state
--------
id
name
私の質問の残りの部分は、そのスキーマが「正しい」ことに同意するという前提に基づいているので、問題ないことを願っています。
インポートが 1 回だけであれば問題ありませんが、銀行ごとに年間 12 回のインポートを行うことになります。これが私がそれを会計処理する方法をどのように考えていたかです:
bank
--------
id
name
account
--------
id
import_id
bank_id
customer_id
number
balance
customer
--------
id
name
ssn
address
city
state_id
zip
state
--------
id
name
import
--------
id
date
excel_file (blob)
これで、すべてのアカウントがインポートに関連付けられ、「アカウント 12345 は 10/13/10 のインポート 572 から発生した」などのことを確実に言うことができます。customer
たとえば、テーブルを見ると、もう少しあいまいになる可能性があります。customer
テーブル内の行数がテーブル内よりも少ないaccount
ため (一部の顧客は複数のアカウントを持っているため)、アカウントとインポートの場合のように、顧客とインポートの間に 1 対 1 の関係はありません。データが失われることも、データの整合性が失われることもないことはわかっていますが、それでも何らかの犠牲を払っているように感じます。
私の質問は (これは自由すぎるかもしれません):これはデータを保存する良い方法だと思いますか? 別の方法でやったでしょうか?
編集: これらのエンティティについて、知っておくべき重要な考え方があります。account
時間をかけて存在する 1 つのアカウントと考えないでください。は、ある時点でのアカウントaccount
のスナップショットと考えてください。したがって、残高 $100 のアカウント 12345 は、残高 $150 のアカウント 12345 と同じではありません。はい、実世界では両方の記録が同じ銀行口座に関連付けられていますが、私が保存しているのは、ある時点での口座のスナップショットです。顧客と同様の (ただし同一ではない) 状況。account