WagtailとPostgreSQLのデータベース構造解説

WagtailとPostgreSQLを組み合わせた場合のデータベース構造について、主要なテーブルの定義と特徴を解説します。

1. ページ関連のテーブル構造

Wagtailの中核となるページ管理システムは、以下のようなテーブル構造で実現されています:

wagtailcore_page テーブル

CREATE TABLE wagtailcore_page ( id SERIAL PRIMARY KEY, path VARCHAR(255) UNIQUE NOT NULL, depth INTEGER NOT NULL, numchild INTEGER NOT NULL, title VARCHAR(255) NOT NULL, slug VARCHAR(255) NOT NULL, live BOOLEAN NOT NULL DEFAULT true, has_unpublished_changes BOOLEAN NOT NULL DEFAULT false, url_path TEXT NOT NULL, owner_id INTEGER REFERENCES auth_user(id), content_type_id INTEGER NOT NULL );

ページリビジョン管理テーブル

CREATE TABLE wagtailcore_pagerevision ( id SERIAL PRIMARY KEY, page_id INTEGER NOT NULL, created_at TIMESTAMP NOT NULL, content_json TEXT NOT NULL );

2. 画像管理テーブル

Wagtailの画像管理システムは以下のテーブルで構成されています:

CREATE TABLE wagtailimages_image ( id SERIAL PRIMARY KEY, title VARCHAR(255) NOT NULL, file VARCHAR(100) NOT NULL, width INTEGER NOT NULL, height INTEGER NOT NULL, created_at TIMESTAMP NOT NULL, focal_point_x INTEGER, focal_point_y INTEGER );

3. 重要なインデックス設定

パフォーマンスを最適化するために、以下のようなインデックスが設定されています:

CREATE INDEX wagtailcore_page_path_idx ON wagtailcore_page(path); CREATE INDEX wagtailcore_page_slug_idx ON wagtailcore_page(slug); CREATE INDEX wagtailcore_page_first_published_at_idx ON wagtailcore_page(first_published_at);

4. カスタムページモデルの作成方法

独自のページタイプを作成する場合は、以下のようにDjangoモデルを定義します:

from wagtail.models import Page from wagtail.fields import RichTextField class BlogPage(Page): date = models.DateField("投稿日") intro = models.CharField("イントロ", max_length=250) body = RichTextField("本文") class Meta: db_table = 'blog_blogpage'

注意点とベストプラクティス

  • テーブルは`python manage.py migrate`コマンドで自動生成されます
  • PostgreSQLの`jsonb`型や`array`型も活用可能です
  • カスタムフィールドの追加は、Djangoのモデル定義を通じて行います
  • パフォーマンスのために適切なインデックスを設定することが重要です

まとめ

WagtailとPostgreSQLの組み合わせは、柔軟で拡張性の高いCMSを実現する強力な基盤となります。 テーブル構造を理解することで、より効率的なカスタマイズと最適化が可能になります。

参考文献