0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

はじめに

Web開発において、避けて通れないのが「スキーマレスなデータへの対応」です。
「顧客ごとに管理項目を変えたい」「商品カテゴリごとにスペックの定義がバラバラ」といった要件に直面したとき、従来のRDB設計(静的なテーブル定義)はしばしば限界を迎えます。

本連載では、このような「動的な要件」をRDBでどう表現し、システムとしてどう実装していくのか、その核心であるメタデータ駆動設計(Metadata-Driven Architecture)を学んでいきます。


1. なぜ「静的なテーブル設計」は破綻するのか

RDBの基本は「事前にカラム(列)を定義する」ことです。しかし、現代のSaaS開発ではこの前提が揺らぐことが多々あります。

  • スパースデータ(疎なデータ)問題:
    特定のカテゴリにしか存在しない項目を全レコードでカラム管理すると、大部分が NULL となる「スカスカのテーブル」が生まれます。
  • 機能拡張のコスト:
    顧客から項目追加の要望があるたびに ALTER TABLE を実行するのは現実的ではありません。

これらの課題に対し、エンジニアは「どうやって動的なデータを保存するか?」という問いに立ち向かってきました。


2. 2つの保存手法:EAV と JSONB

「スキーマレスなデータをRDBでどう表現するか?」という問いに対する答えとして、歴史的に大きく2つのアプローチがあります。

手法A:EAV(Entity-Attribute-Value)

データを「主体・属性・値」に分解し、縦持ちで保存します。

  • 本質: 属性そのものを「データ」として扱う。
  • 特徴: メタデータ管理に非常に厳格。反面、複雑なクエリ(JOIN地獄)を招きやすく、型制約が失われやすい。

手法B:JSONB(ドキュメントパターン)

動的なデータをJSONとして1つのカラムに押し込む設計です。

  • 本質: スキーマレスな柔軟性を「バイナリ」として保存する。
  • 特徴: クエリがシンプルで、アプリケーションの構造体と相性が良い。現代のWeb開発における主流な選択肢。

3. なぜこれらを学ぶのか:メタデータ駆動設計という思想

EAVやJSONBを語る際、多くのエンジニアが「SQLの書き方」に終始してしまいます。しかし、重要なのは「なぜその手法を使うのか?」という目的です。

私たちが目指すのは、メタデータ駆動設計です。
これは、プログラムを「万能なエンジン」として作り、その使い方(構造・バリデーション・表示ルール)をデータベース上のメタデータとして外出しする設計思想です。

  • コードを変えずに振る舞いを変える: データベースの「設定」を書き換えるだけで、システムに新しい機能や項目が追加される。
  • 開発の抽象化: 個別の業務ロジックを書くのではなく、「定義を解釈して動く汎用エンジン」を作ることに集中できる。

4. この連載で学ぶこと

本シリーズでは、以下のステップで「ノーコードツールや大規模SaaSの裏側」を実装レベルで解き明かしていきます。

  • Step 0: 全体像(本記事)
  • Step 1: メタデータリポジトリの設計(設定を管理するDB設計)
  • Step 2: SQL自動生成エンジンの実装(実行時にクエリを組み立てる)
  • Step 3: Server-Driven UIの構築(メタデータからUIを動的に生成する)
  • Step 4: 動的データの集計とパフォーマンス(GINインデックスと集計戦略)
  • Step 5: バリデーションと権限の外部化(メタデータによる動的制約)

「コードを一行も書かずに新機能が増える」という魔法のような体験を、RDBとメタデータという武器を使って、一緒に実装していきましょう。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?