0

PostgreSQLデータベースを備えたDjangoWebサイトがあります。「フラット」アイテムテーブル用のDjangoアプリとモデルがあり、多くのレコードが定期的に挿入され、1か月あたり最大数百万の挿入が行われます。これらのレコードを使用して、ファクトテーブルとディメンションテーブルのスタースキーマ(最初はDjango models.pyでもモデル化されています)に自動的にデータを入力して、レコードに対して複雑なクエリを効率的に実行し、Djangoサイトにそれらのデータを表示したいと思います。 。

2つの主なオプションが次々と登場します。

1)PostgreSQLトリガー:データベースを直接構成して、レコードの作成または更新に基づいて、適切な行をファクトテーブルとディメンションテーブルに挿入します。トリガーの後にPython/PL-pgsqlと行レベルを使用することもできます。長所:Djangoの外部の入力で動作します。より効率的であることが期待されるかもしれません。短所:ビジネスロジックを別の場所に分割します。挿入のトリガーは、他の入力ソースでは予期されない場合があります。

2)Django Signals:Signals機能を使用して、組み込みのシグナルdjango.db.models.signals.post_saveを使用して、レコードの作成または更新時に挿入を実行します。長所:構築と保守が簡単です。短所:新しい入力ソースをサポートするには、コードを繰り返すか、Djangoサイト/アプリ環境内にとどまる必要があります。

Djangoの組み込みシグナルは、ファクトテーブルとディメンションテーブルを維持するための方法であると私は考えていますか?または、見逃されている他の重要なオプションはありますか?

4

1 に答える 1

0

結局、DjangoSignalsを使用しました。フィールド「item」と「description」を含むフラットテーブル「item_record」を使用すると、models.pyのコードは次のようになります。

from django.db.models.signals import post_save

def create_item_record_history(instance, created, **kwargs):
    if created:
        ItemRecordHistory.objects.create(
            title=instance.title, 
            description=instance.description, 
            created_at=instance.created_at,
            )
post_save.connect(create_item_record_history, sender=ItemRecord)

それは私の目的のためにうまく動いています。注釈付きのフラットテーブル(新しいフィールド "created_at")を作成しているだけですが、同じ方法を使用してスタースキーマを構築できます。

于 2013-01-22T22:44:41.600 に答える