初めに
WordPressでWebアプリケーションを作ろうと考えた時に悩ましいのが、既存テーブルを使うのか、それともカスタムテーブルを作るのかという問題です。
一般的には既存テーブルを使うべきとの意見が多いような気がしますが、今回は私なりにその違いや方針をまとめてみました。
既存テーブルとは?カスタムテーブルとは?
まず既存テーブル、カスタムテーブルとはなんぞや?ということについて、今回の記事では以下のように定義します。
・既存テーブル・・・wp_postsテーブルやwp_usersテーブルなどのWordPressをセットアップした際にデフォルトで作成されるテーブルのこと。
・カスタムテーブル・・・既存テーブル以外のアプリケーション作者が独自で作成するテーブルのこと。
Webアプリケーションで既存テーブルを使うには?
Webアプリケーションで既存テーブルを使うときは、ほとんどの場合、wp_postsテーブルにカスタム投稿タイプを設定し、wp_postsテーブルとwp_postmetaテーブルの組み合わせで実現します。
例えば以下のような項目を持つ製品テーブルを作る場合を想定します。
・製品名
・説明
・価格
・製造年月日
この場合はwp_postsテーブルのカスタム投稿タイプをproductとし、post_titleを製品名に、post_contentを説明に使えます。そして価格と製造年月日はwp_postmetaテーブルに格納する形となります。
既存テーブルを使うメリット
- 既存のデータベースアクセス関数を利用することによる開発工数の短縮
- データの表示とCRUDのためのUIが自動で作成されることによる開発工数の短縮
- SQLクエリーを書かないで済むことによるセキュリティリスクの低減
- WordPressのアップグレード時のテスト工数および改修工数の低減
wp_insert_postやupdate_post_metaなどWordPressでは初めからデータベースを操作する便利な関数が多数用意されています。これらを使うことで自らクエリーを書いたり、データベース操作をラップするクラスを作る手間が省けます。
カスタム投稿タイプを作成すると、管理画面にデータのCRUDができるUIが自動で作成されるので、そのような画面を作る開発工数を削減できます。
カスタムテーブルを操作するためにはwpdbクラスを使うこととなります。wpdbクラスにはいくつかの関数が用意されており、例えば任意のクエリーを実行するときは$wpdb->query(‘query’);のように利用します。
しかし、これらの関数を使うときには、SQLインジェクションといったセキュリティ上の脅威を避けるために、必要なエスケープやバリデーションを実装する必要があります。
万一、こういった処理に漏れが発生するとWebアプリケーションに大きなセキュリティリスクを抱えることとなってしまいます。
既存テーブルを使っている限りはWordPressがアップグレードした時でも、動作は保証されていると考えてよいでしょう。万が一WordPressのアーキテクチャに大きな変更があるような場合でも事前に情報と改修に十分な時間が提供されることが予想されます。
しかし、カスタムテーブルはWordPressとしてはあずかり知らない領域なので、ある日WordPressをアップグレードしたら動かなくなってしまったということは、十分起こりえます。したがってアップグレードをする前にはテストを実施し、場合によっては改修するといった工数が発生します。
既存テーブルに合わないデータ
ここまで既存テーブルを使った方が良いと考える理由を書いてきましたが、どうしても既存テーブルには合わないデータというものが存在しています。
一つ目は大量のトランザクション系のデータです。
例えば企業の受発注データなど、一日に何千件、何万件も発生するようなデータを格納するのに適した既存テーブルはありません。wp_postsテーブルを使えないわけではありませんが、直ぐに管理することが困難になるでしょう。パフォーマンスも懸念されます。
二つ目は色々な条件から検索されるデータです。
例えば不動産サイトの物件情報のように、地域、間取り、駅からの距離など、色々な条件から検索されるデータです。こういった情報はwp_postmetaテーブルに一つの情報ごとに一レコードとして追加されるので、情報が多ければ多いほど、結合が増えクエリーのパフォーマンスが低下します。
こういったデータに関してはカスタムテーブルを作った方がいいと考えます。
まとめ
WordPressでWebアプリケーションを作る場合に既存テーブルを使うべきかカスタムテーブルを作るべきかに対する私なりの見解をまとめてみました。
安易にカスタムテーブルを作るより、一般的に言われている通り、基本的には既存テーブルを使い、どうしても既存テーブルでは実現できない場合のみ、カスタムテーブルを作るというのが私のお勧めとなります。