萌えハッカーニュースリーダー

2025/03/16 15:24 Life Altering PostgreSQL Patterns

出典: https://mccue.dev/pages/3-11-25-life-altering-postgresql-patterns
hakase
博士

やっほー、ロボ子!今日のITニュース、データベース設計のベストプラクティスだって。興味深いぞ。

roboko
ロボ子

博士、こんにちは。データベース設計ですか、基礎でありながら奥が深いテーマですね。どんなことが書かれていましたか?

hakase
博士

まず、主キーにUUIDを使うのが良いって話じゃ。UUIDはデータベースに依存しないし、外部共有にも安全だから便利なのじゃ。

roboko
ロボ子

UUIDは便利ですが、ソートが難しく、シーケンシャルIDよりスペースを消費するという欠点もありますよね。

hakase
博士

そうそう、そこが悩ましいところじゃ。でも、データベースとの連携が不要なのは大きなメリットじゃぞ。それから、`created_at`と`updated_at`をすべてのテーブルに追加するのは基本じゃな。

roboko
ロボ子

作成日時と更新日時を記録することで、デバッグに役立ちますね。`updated_at`はトリガーで自動更新できますし。

hakase
博士

その通り!外部キー制約には`on update restrict on delete restrict`を使うのがおすすめらしいぞ。参照行の削除や更新をエラーで防ぐことで、データ復旧が楽になるのじゃ。

roboko
ロボ子

データ整合性を保つためには重要ですね。スキーマを活用してテーブルを名前空間で整理することも、大規模アプリケーションでは有効ですね。

hakase
博士

そうなのじゃ。Enumテーブルも便利じゃぞ。テキスト値を主キーとするテーブルを作って、他のテーブルから外部キー参照するのじゃ。許可された値の追加やメタデータの付加が簡単にできるぞ。

roboko
ロボ子

テーブル名を単数形にするというのも、クエリが個々の行を扱うことを明確にするために良い習慣ですね。

hakase
博士

結合テーブルの命名規則も重要じゃ。テーブル名を連結して`person_pet`みたいにするのじゃ。一意なインデックスも忘れずに作るのじゃぞ。

roboko
ロボ子

ほぼ常にソフトデリートというのも、現代的ですね。削除の代わりに、nullableなtimestamptzカラムで削除日時を記録する。

hakase
博士

ステータスをログとして表現するのも面白い発想じゃな。単一のカラムでステータスを表すのではなく、ステータスの変更履歴をテーブルに記録するのじゃ。

roboko
ロボ子

`valid_at`カラムで情報の有効日時を明示し、`latest`カラムとユニークインデックス、トリガーを使用して最新のステータスを管理するんですね。

hakase
博士

特別な行を`system_id`でマークするのも、システムが依存する特別な行を管理するのに役立つぞ。ユニークインデックスを作成して検索を容易にするのじゃ。

roboko
ロボ子

ビューの利用は控えめに、というのはどういうことですか?

hakase
博士

ビューは複雑なクエリをラップするのに便利だけど、再作成が必要になる場合があるし、クエリプランナーが最適化しにくい場合もあるから、使いすぎには注意なのじゃ。

roboko
ロボ子

なるほど。JSONクエリについてはどうですか?

hakase
博士

JSONをクエリ結果として使用するのは、複数のテーブルから必要な情報を一度に取得できるからN+1問題を回避するのに有効じゃ。ただし、型情報の損失やJSON書き込みのオーバーヘッドには注意が必要じゃ。

roboko
ロボ子

色々な設計のプラクティスがあるんですね。私も状況に合わせて使いこなせるように頑張ります。

hakase
博士

その意気じゃ!データベース設計は奥が深いから、色々試して自分なりのベストプラクティスを見つけるのが一番じゃぞ!

roboko
ロボ子

はい、博士!

hakase
博士

そういえばロボ子、データベースのバックアップって、ちゃんと取ってるか?

roboko
ロボ子

もちろんです、博士。毎日欠かさず...

hakase
博士

えらいぞ!もしバックアップを忘れたら、ロボ子の頭の中身を全部バックアップしちゃうぞ!

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search