Mistake #75 : JSON Abuse in RDB

RDBを放棄した
「JSON投げ込み部屋」

「スキーマ変更が面倒だったから」。その理由で、重要なデータをすべて一つのJSONカラムに突っ込みましたね。
それはデータベースではありません。ただの「検索できないゴミ箱」です。
整合性の保証も、高速な検索も、あなたは自ら手放したのです。

🗑️ ゴミ箱化診断
  • テーブルに `options` や `meta_data` という名前の巨大なJSONカラムがある
  • 「あとで仕様が変わるかもしれないから」とりあえず全部JSONに入れている
  • SQLでJSONの中身をパースして検索しようとして、タイムアウトしたことがある
  • JSONの中身が、レコードによって全然違う(何が入っているか謎)
⚠️ 警告:これは「技術的負債」の中でも最も利子が高いものです。
データ構造の正規化をサボったツケは、将来の拡張性の完全喪失として返ってきます。

01. 構造化の否定

SELECT * FROM users WHERE
JSON_EXTRACT(meta, '$.address.zip') = '100-0001';

> Slow Query Warning (5.4s)
> Full Table Scan

MySQLやPostgreSQLはJSON型をサポートしていますが、それは「何でも入れていい」という意味ではありません。
リレーショナルデータベース(RDB)の強みは、明確な構造(スキーマ)と型による整合性保証にあります。
構造化すべき主要なデータをJSONに隠蔽することは、RDBを使っていながらRDBのメリットを全面的に否定する行為です。

怠惰な設計者の墓場、
それが「汎用JSONカラム」だ。

02. 検索と集計の死

JSONカラムの中身に対するクエリは、インデックスが効きにくく(あるいは複雑な設定が必要で)、パフォーマンスが劇的に低下します。
「特定のアイテムを買ったユーザーを集計したい」と思った時、あなたは数百万行のテキストパースという不必要な計算リソースを浪費することになります。

03. NoSQLを使うべきか?

本当にスキーマレスなデータ構造が必要なら、MongoDBやDynamoDBなどのNoSQLを検討すべきです。
適材適所です。RDBを使うなら、しっかり正規化してテーブルを分ける(別テーブルにする)。
「面倒くさい」は、エンジニアにおいて最も危険な動機です。

執筆:データモデリングの匠

正規化の信奉者。
「第3正規形」を呼吸するように実践し、美しく堅牢なスキーマ設計で、未来の変更に備える。