1. ホーム
  2. postgresql

[解決済み] PostgreSQLで継承されたテーブルを使用するのはどのような場合ですか?

2023-02-03 08:32:13

質問

どのような場面で継承したテーブルを使うべきでしょうか?ざっと使ってみましたが、継承はOOPの世界にはなさそうな気がしました。

このような仕組みになっているのかと思いました。

テーブル users には、すべてのユーザー・レベルに必要なすべてのフィールドがあります。のようなテーブルは moderators , admins , bloggers などがありますが、フィールドは ではなく は親からチェックされます。例えば users は email フィールドを持ち、継承された bloggers にもあるのですが、どちらも一意ではありません。 usersbloggers の2つのテーブルに同時に追加することができます。

私が思いついた唯一の使い方は、通常使用されるフィールド、例えば row_is_deleted , 作成日時 , 変更日時 . 継承したテーブルの使い方はこれだけなのでしょうか?

どのように解決するのですか?

postgresでテーブル継承を使用する主な理由はいくつかあります。

例えば、統計に必要ないくつかのテーブルがあり、毎月作成されて埋まっていくとします。

statistics
    - statistics_2010_04 (inherits statistics)
    - statistics_2010_05 (inherits statistics)

このサンプルでは、各テーブルに2.000.000行が格納されています。各テーブルには、一致する月のデータのみが格納されるようにCHECK制約が設定されています。

では、何が継承をクールな機能にしているのでしょうか。なぜ、データを分割することがクールなのでしょうか。

  • パフォーマンス: データを選択するとき、我々はSELECT * FROM statistics WHERE date BETWEEN x and Y、そしてPostgresはそれが意味をなすテーブルのみを使用します。例えば、SELECT * FROM statistics WHERE date BETWEEN '2010-04-01' AND '2010-04-15' は statistics_2010_04 テーブルのみをスキャンし、他のすべてのテーブルには触れません - 高速です!
  • インデックスサイズ。我々は、日付カラムに大きなインデックスを持つ大きなテーブルを持っていません。月ごとに小さなテーブルを持ち、小さなインデックスを持つ - より速い読み取り。
  • メンテナンス。他のデータをロックすることなく、各月のテーブルに対してバキュームフル、再インデックス、クラスターを実行できます。

性能向上のためのテーブル継承の正しい使い方については、postgresqlのマニュアルを参照してください。 各テーブルにCHECK制約を設定し、どのキーでデータが分割されるかをデータベースに伝える必要があります。

私はテーブル継承を多用しています。特に、月ごとにグループ化したログデータを保存するときはそうしています。ヒント: 決して変更されないデータ(ログデータ)を保存する場合、CREATE INDEX ON () WITH(fillfactor=100) でインデックスを作成します。

UPDATEを行います。 fillfactor のデフォルトは100です。 http://www.postgresql.org/docs/9.1/static/sql-createtable.html :

fillfactor は 10 から 100 までのパーセンテージです。100 (完全なパッキング) がデフォルトです。