[解決済み] PostgreSQLで継承されたテーブルを使用するのはどのような場合ですか?
質問
どのような場面で継承したテーブルを使うべきでしょうか?ざっと使ってみましたが、継承はOOPの世界にはなさそうな気がしました。
このような仕組みになっているのかと思いました。
テーブル
users
には、すべてのユーザー・レベルに必要なすべてのフィールドがあります。のようなテーブルは
moderators
,
admins
,
bloggers
などがありますが、フィールドは
ではなく
は親からチェックされます。例えば
users
は email フィールドを持ち、継承された
bloggers
にもあるのですが、どちらも一意ではありません。
users
と
bloggers
の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 (完全なパッキング) がデフォルトです。
関連
-
PostgreSQLで時間指定タスクを実装する4つの方法
-
[解決済み] PostgreSQLの場合。PostgreSQLのテーブルを表示する
-
[解決済み] PostgreSQLの "DESCRIBE TABLE"
-
[解決済み] PostgreSQL コマンドラインユーティリティ: psql を終了する方法
-
[解決済み] PostgreSQLのユーザーパスワードを変更する方法を教えてください。
-
[解決済み] どのバージョンのPostgreSQLを使用していますか?
-
[解決済み] PostgreSQLでデータベースのコピーを作成する
-
[解決済み] PostgreSQLの場合。PostgreSQLですべてのテーブルのOWNERを同時に変更する
-
[解決済み】Mac OS XでPostgreSQLサーバーを起動するには?
-
[解決済み】PostgreSQLのエラーです。Fatal: ロール "username" が存在しません。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
PostgreSQLでバッファキャッシュにデータを読み込む方法
-
postgresql いくつかのメソッドは、要約の重複するデータを削除する
-
PostgreSQLはバッチ実行のためにSQLをファイルに実装しています。
-
PostgreSQLのデータベースでLIKE文の効率を確保する方法(推奨)
-
[解決済み] Postgres の全テーブルの行数を求めるには?
-
[解決済み] PostgreSQLのクエリを記録する方法は?
-
[解決済み] varcharフィールドの型をintegerに変更する。"自動的にinteger型にキャストすることはできません"
-
[解決済み] PostgreSQL公式Dockerイメージの設定ファイルをカスタマイズする方法とは?
-
[解決済み] Postgresの場合。1つのカラムだけ区別される
-
[解決済み] クエリプランにおける「ビットマップヒープスキャン」とは何ですか?