WordPressのデータベースを解析してみる

ちょいとCMS(Contents Management System)の構築をやることになったので、パクるもとい設計の参考にするために、このブログでも使っている世界一有名といっていいCMS、WordPressのテーブル構成を解析してみようと思います。

WordPressのテーブル

驚くことにWordPressの主要テーブルは11個しかありません(別途プラグインを入れると増えます)。
テーブル設計が優れてるシステムはテーブル数が少ないので然もありなんですね。

テーブル一覧

テーブル名機能
wp_commentmetaコメントのメタデータを管理
wp_comments投稿へのコメントを管理
wp_linksリンクを管理
wp_optionsオプション設定
wp_postmeta投稿のメタデータ
wp_posts投稿を管理
wp_termsカテゴリ・タグ
wp_term_relationships記事とカテゴリ・タグの関連付け
wp_term_taxonomyカテゴリ・タグの分類
wp_usermeta登録ユーザーメタ情報
wp_users登録ユーザー情報

ER図

SIer御用達、A5:SQL Mk-2で作りました。
FKとかの表記は間違ってるかも…。

各テーブル説明

wp_commentmeta

イマイチ用途が謎。記事コメントを削除したときなどにレコードができるらしい。

wp_comments

記事へのコメント内容を格納しています。
ユーザーエージェントも拾ってくれます。

wp_links

リンクを管理するらしいが、今は使われてないっぽい。

wp_options

WordPressそのものの設定や、ブログタイトルなんかを保存しています。
いわゆるSQLアンチパターンのEAV(Entity-Atribute-Value)設計になっています。

wp_posts

投稿そのものを管理するテーブル。記事タイトルや記事内容のHTMLが入っています。
投稿は変更すると古いものは履歴となり新しいレコードが増えていく構成になってます。

wp_postmeta

これもEAVテーブルですね。
wp_postsへのカスタムフィールドとしての役割を持ちます。

wp_terms

記事に設定するカテゴリやタグの文言を管理します。
カテゴリもタグも一緒に格納しています。

wp_term_relationships

投稿とカテゴリ・タグの紐づけを管理してます。

wp_term_taxonomy

wp_termsのレコードがタグなのかカテゴリなのかを管理しています。

wp_usermeta

EAVテーブル。
wp_usersへのカスタムフィールドとしての役割を持ちます。

wp_users

Wordpresを操作できるユーザーを格納しています。

まとめ

設計で参考になりそうなのは…。

投稿を一つのテーブルで履歴管理している。

個人的には履歴テーブルを別に持つ方が好きです。
データ追っかけやすいんで。

EAVテーブルで機能拡張に備える

予め予備のカラムをいっぱい持っとくよりはスマートですよね。
アンチパターンだけど、システムの拡張に備えるには必要でしょう。

タグとカテゴリを同一テーブルで管理

別のテーブルにタグかカテゴリの情報を持たせることのメリットはなんでしょうね?
子のカテゴリとか親のカテゴリに対応するためかな…。

ユーザーは1テーブルで管理

別にadminユーザーと分ける必要はないですよね。
複雑そうなWordPressをこの数のテーブルでやりくりしてるのはすごいですよね。
余裕があればカラムの内容もおっかけてみようと思います。

でわ!