2016-05-03 9 views
0

私は、居住者に関する情報をフラットコンプレックスに格納するPostgreSQLテーブル(住人テーブル)を持っています。 50棟あると言う。私はここに住む各家族についての詳細な情報を持っています。いくつかの列は、Resident_type(rented、owned、..)、Members_count、Pets..etcです。リレーショナルデータベーステーブルのランダムカラムのデータ変更を追跡する

私は約50個のレコードで300個以上の列を持っています。だからこれはいくつかの州の住民を記録するスコアボードのようなものです。

何か変更があります。家族の番号:23は2016年3月10日に新しい犬を得ました.Pet_countのようなそれぞれの列を0から1に更新し、Pet_type fron NoneをDogに更新します。

このようなイベントはランダムに発生しています。年のほとんどの時間は何も変わらない。だから私がこれらのランダムな変更を追跡したければ s、何をするか?

私はレコードの数は少ないが、列の数が多すぎることを覚えておいてください。

また、私はpostgresqlでsqlalchemyを使用しています。しかし、そのデータベースの一般的な質問!何体は私に、より良いオプションは与えていない場合

マイプランB:私はつもりだ

を、二つのグループに自分のデータを分割します。時間変更可能なデータ(居住者detais、家メンバー、ペットstaus ...)、永続的なデータ(家の番号、平らな場所、部屋...のような)。私は時間の変更可能な列を弱い数値の列を持つテーブルにします。より良い解決策があると確信しています。

答えて

1

ここには変更データを記録するためのデザインパターンがありますが、2つのバージョンがあります。

最初のバージョンには、テーブルとそのテーブルのビューが含まれています。テーブルはすべてのテーブル列とタイムスタンプ列で構成されています。挿入と更新ごとに1つの行があります。家族23に犬がいる場合は、犬(2013年に戻ったもの)と行があり、行には犬がいます。 、2016)。この表には、各家族の完全な履歴が含まれています。

ビューは、家族ごとに最新の行のみを選択します。これは「今」のスナップショットです。

このパターンの2番目のバージョンには、2つのテーブルとトリガがあります。メインテーブルは、あなたが現在持っているようなものです - 家族一列。このテーブルにはトリガがあります:トリガは、更新するたびにタイムスタンプ付きの行を2番目のテーブルに挿入します。

両方のバージョンでは、変更がアーカイブされたテーブルと、現在の状態のテーブルまたはビューがあります。

2番目のバージョンがうまくいくように聞こえます。これは、頻繁に読み書きが頻繁に行われるセットアップ(記述のとおり)に適しています。トリガーを使用できるため、アプリケーションに変更を加えることなくデータベースレイヤーでのみ実装できる可能性が高くなります。

CREATE VIEW current_data AS 
    SELECT c.family_no, c.dog, .... 
    FROM (SELECT family_no, 
       MAX(changed_timestamp) as most_recent 
     FROM historical_data 
     GROUP BY family_no) h, 
     historical_data c 
    WHERE 
    c.family_no = h.family_no AND 
    c.changed_timestamp = h.most_recent; 
+0

おかげで、あなたの詳細な回答のために:


は、ここで最初のアプローチでビューのために必要なSQLの種類の例です。したがってアプローチ1では、テーブルは更新の数だけ増加します。多くのデータが重複して不必要に重大になるようなものです。しかし、それは大丈夫だった、問題は今はるかに簡単です。だから、この "スナップショット"はpostgreSQLでサポートされています(私はそれはしていますが...)またはより良いsqlalchemy ..そしてどうやって..??あなたがこれを知っているなら、それにも答えてください。 – ISONecroMAn

+0

このような履歴を保存するという性質は、データの重複、またははるかに多くの作業を必要とします。私は最初の方法を試してみるためにサンプルビュー定義を含めるように私の回答を編集しました。 – jmelesky

+0

Hey .. historical_dataテーブルを使った2番目のアプローチの文脈で、簡単な質問〜私が常駐テーブルのPK(resident_id)を外部キーとして使用する他のテーブルを持っている場合、これは正しく動作します。 – ISONecroMAn

関連する問題