1

次のようなモデルでタグ付けシステムを設計しようとしています:

Tag:
   content = CharField
   creator = ForeignKey
   used = IntergerField

これは、タグとタグ付けされたものとの間の多対多の関係です。

関連付けテーブルにレコードを挿入するたびに、 Tag.usedが 1 増加し、削除の場合は 1 減少します。

Tag.usedは、「このタグは何回使用されていますか?」という質問への回答を高速化するために維持されています。

ただし、これにより明らかに挿入が遅くなるようです。

このデザインを改善する方法を教えてください。

前もって感謝します。

http://www.pui.ch/phred/archives/2005/06/tagsystems-performance-tests.html

4

2 に答える 2

1

そのようにデータを非正規化するのは良い考えではないと思います。

より洗練された解決策は、django アグリゲーションを使用して、タグが使用された回数を追跡することだと思いますhttp://docs.djangoproject.com/en/dev/topics/db/aggregation/

次のように呼び出して、タグ オブジェクトに使用済みカウントをアタッチできます。

my_tag = Tag.objects.annotate(used=Count('post'))[0]

次に、次のようにアクセスします。

my_tag.used

Tag クラスに ManyToMany フィールドを持つ Post モデル クラスがあるとします。

必要に応じて、名前付きの注釈付きフィールドでタグを並べ替えることができます。

Tag.objects.annotate(used=Count('post')).order_by('-used')
于 2010-04-08T05:36:50.633 に答える
1

データベースが具体化されたインデックス付きビューをサポートしている場合は、このために作成することをお勧めします。ここにあると思われる、データを集計する頻繁に実行されるクエリのパフォーマンスを大幅に向上させることができます。

あなたのビューは次のようなクエリになります。

SELECT
    TagID,COUNT(*)
    FROM YourTable
    GROUP BY TagID

集計を事前に計算してインデックスに格納することで、クエリ実行中のコストのかかる計算を最小限に抑えることができます。

于 2010-04-08T12:08:32.507 に答える