2

Django インストールと一緒に postgresql でパーティション分割されたテーブルを使用しようとしています。

件名をグーグルで調べたところ、Djangoはそれ自体でパーティション分割をサポートしていないことがわかったので、自分でテーブルのパーティション分割を行いました。別のテーブルの外部キーである 2 番目のフィールドに基づいてテーブルを分割します。基本的なモデルのセットアップは次のようになります。

class Event(models.Model):
    id = models.AutoField(primary_key=True)
    device = models.ForeignKey("Device")
    ... (More Fields)

テーブルを device_id で分割し、event_1、event_2 などのサブテーブルを生成しました。すべてのクエリにはデバイス ID が含まれているため、クエリははるかに高速になりましたが、挿入のために、django は次のような UPDATE ステートメントを生成します。

UPDATE event SET device=X, ...=X, ... WHERE id=XXX

これにより、データベースはテーブルのすべてのパーティションを走査して、指定された ID を探します。device_id は変更されないため、device_id=XXX ステートメントを UPDATE ステートメントの WHERE 部分に追加して、データベースが 1 つのパーティションのみをトラバースできるようにします。

私の問題は、データベースの主キーにパーティションキーがないという問題の結果に過ぎないと思いますが、djangoは1つのフィールドのみをPKとしてサポートし、パーティションキーは一意ではないため、できますPKとして使用しないでください。

私の問題に対する2つの解決策を考えることができます:

  1. device_id (1_234 など) と組み合わされた増加する数値から何らかの形で自動的に構築される主キー フィールドを使用します。次に、データベースは主キーを分割して、このイベントがどのデバイス用で、どのパーティションを検索する必要があるかを知る必要があります。
  2. UPDATE ステートメントを変更して、device_id を WHERE ステートメントに追加します。

私の意見では、最もエレガントな方法は、主キーに device_id を含めることです。したがって、Django に変更を加える必要はなく、パーティショニングは Django に対して透過的なデータベースでのみ行われます。ただし、データベースにそのような主キーを作成できるかどうかはわかりません。

ご協力ありがとうございました

4

1 に答える 1