RDBを放棄した
「JSON投げ込み部屋」
「スキーマ変更が面倒だったから」。その理由で、重要なデータをすべて一つのJSONカラムに突っ込みましたね。
それはデータベースではありません。ただの「検索できないゴミ箱」です。
整合性の保証も、高速な検索も、あなたは自ら手放したのです。
- テーブルに `options` や `meta_data` という名前の巨大なJSONカラムがある
- 「あとで仕様が変わるかもしれないから」とりあえず全部JSONに入れている
- SQLでJSONの中身をパースして検索しようとして、タイムアウトしたことがある
- JSONの中身が、レコードによって全然違う(何が入っているか謎)
データ構造の正規化をサボったツケは、将来の拡張性の完全喪失として返ってきます。
01. 構造化の否定
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を使うなら、しっかり正規化してテーブルを分ける(別テーブルにする)。
「面倒くさい」は、エンジニアにおいて最も危険な動機です。