|
| 1 | +--- |
| 2 | +title: "PostgreSQL設計ガイドラインのご紹介" |
| 3 | +date: 2025/05/30 00:00:00 |
| 4 | +postid: a |
| 5 | +tag: |
| 6 | + - PostgreSQL |
| 7 | + - AWS |
| 8 | + - Aurora |
| 9 | + - DB設計 |
| 10 | + - ガイドライン |
| 11 | +category: |
| 12 | + - DB |
| 13 | +thumbnail: /images/20250530a/thumbnail.png |
| 14 | +author: 宮崎将太 |
| 15 | +lede: "フューチャー社内の有志メンバーでPostgreSQLDB設計ガイドラインを作成しました。" |
| 16 | +--- |
| 17 | +# はじめに |
| 18 | + |
| 19 | +フューチャー社内の有志メンバーでPostgreSQL DB設計ガイドラインを作成しました。 |
| 20 | + |
| 21 | +- [PostgreSQL設計ガイドライン | Future Enterprise Arch Guidelines](https://future-architect.github.io/arch-guidelines/documents/forDB/postgresql_guidelines.html) |
| 22 | + |
| 23 | +形になってから数ヶ月寝かせており、ある程度社内の指摘を取り込むことができたのでこのタイミングで告知します |
| 24 | + |
| 25 | +<a href="https://future-architect.github.io/arch-guidelines/documents/forDB/postgresql_guidelines.html"> |
| 26 | +<img src="/images/20250530a/image.png" alt="" width="1200" height="800" loading="lazy"> |
| 27 | +</a> |
| 28 | + |
| 29 | +# よくあるDB設計規約との差別化ポイント |
| 30 | + |
| 31 | +単にDB設計ガイドラインというと何を今更?感もあるので、命名規則や型桁など一般的な内容に加え、以下の点でよくあるDB設計ガイドラインから一歩踏み込んだコンテンツとなるよう心がけました。 |
| 32 | + |
| 33 | +## 論理設計への踏み込み |
| 34 | + |
| 35 | +単なるテーブル定義やデータ型選択にとどまらず、より高度な論理設計の原則に焦点を当てています。 |
| 36 | + |
| 37 | +### マスタ/トラン/ワーク |
| 38 | + |
| 39 | +データベース設計において、データの種類に応じてテーブルを明確に分離することは設計効率と保守性を高める上で重要ですが、意外とその定義は曖昧であり、しばしば初学者の障壁となります。本ガイドラインでは以下の通り明確に分類を定めています。 |
| 40 | + |
| 41 | +* **マスタテーブル:** ビジネスの中核となる静的な情報(例:顧客情報、商品カタログ)を格納 |
| 42 | +* **トランザクションテーブル(トランテーブル):** ビジネスプロセスで発生する動的な出来事(例:注文履歴、在庫変動)を記録 |
| 43 | +* **ワークテーブル:** 一時的な処理や中間結果を保持するために使用 |
| 44 | + |
| 45 | +これらのデータの特性を踏まえ、それぞれについて下記の言及しています。 |
| 46 | + |
| 47 | +* テーブル設計 |
| 48 | +* インデックス戦略 |
| 49 | +* アクセスパターン |
| 50 | + |
| 51 | +### スナップショット属性、導出属性 |
| 52 | + |
| 53 | +RDBにおけるテーブルデザインといえば、基本は正規化するべしというのがスタンダードな考え方です。 |
| 54 | +一方で、下記のように敢えて非正規化し、カラムとして保持させるべきケースもあります。 |
| 55 | + |
| 56 | +* **スナップショット属性:** 特定の時点におけるエンティティの状態を記録し、履歴管理や監査に使用する |
| 57 | +* **導出属性:** 既存の属性から計算される情報であり、例えば、注文日の属する四半期や、顧客の累積購入金額などが該当する。 |
| 58 | + |
| 59 | +本ガイドラインではこれらの属性の適切な管理方法について、以下の指針を示しています。 |
| 60 | + |
| 61 | +* いつスナップショットを取得すべきか |
| 62 | +* 導出属性を物理的に格納するか(性能とのトレードオフ) |
| 63 | + |
| 64 | +### 業務日付 |
| 65 | + |
| 66 | +中規模以上のシステムになると、以下の様なケースに耐えるためシステム日付とは別に業務日付を保持させることがあります。 |
| 67 | + |
| 68 | +* 店舗の営業時間が26時などの場合に、コンピューターの持つ日付(システム日付)とずれた営業日単位で登録/集計を可能とするため |
| 69 | +* 日をまたぐバッチ処理や画面操作(システムメンテナンスなどを想定)に対して、データ整合性を保ちやすくする |
| 70 | +* 障害調査や結合テスト/負荷検証などで、特定の日付におけるテストを再現しやすくする |
| 71 | + |
| 72 | +小規模なWebアプリケーションではあまり発生しない概念ですが、本ガイドラインでは業務日付を使用するべきケース、そうでないケース、使用する場合の推奨データ型や注意点を記載しています。 |
| 73 | + |
| 74 | +### 世代管理 |
| 75 | + |
| 76 | +データの変更履歴を管理する世代管理は、データ復旧や過去の状態参照において重要な役割を果たします。これを実現するための具体的な方法として、以下のものが考えられます。 |
| 77 | + |
| 78 | +* タイムスタンプ付きの履歴テーブルの利用 |
| 79 | +* 論理削除フラグの活用 |
| 80 | + |
| 81 | +データの重要度や変更頻度に応じて適切な世代管理戦略を選択するための基準を示しています。 |
| 82 | + |
| 83 | +## その他設計パターンへの踏み込み |
| 84 | + |
| 85 | +### 排他制御 |
| 86 | + |
| 87 | +複数のトランザクションが同時に同じデータにアクセスする状況下で、データの整合性を保つための排他制御は非常に重要です。 |
| 88 | +本ガイドラインでは、以下の点について解説しています。 |
| 89 | + |
| 90 | +* PostgreSQLを利用する場合のロック機能の適切な利用方法 |
| 91 | +* デッドロックを回避するためのプラクティス |
| 92 | + |
| 93 | +### マルチテナント |
| 94 | + |
| 95 | +複数の顧客や組織が同一のアプリケーションやデータベースインスタンスを共有するアーキテクチャはマルチテナントアーキテクチャと呼ばれ、コスト効率に優れています。 |
| 96 | +世間的に広く認知されているものの、実際に設計・実装しようとすると、以下の点が重要な課題となります。 |
| 97 | + |
| 98 | +* テナント間のデータ隔離 |
| 99 | +* セキュリティ確保 |
| 100 | +* 性能 |
| 101 | + |
| 102 | +本ガイドラインでは、複数考えられるマルチテナントアーキテクチャ設計パターンのメリット・デメリットを比較し、ケース毎に推奨される設計方針を打ち出しています。 |
| 103 | + |
| 104 | +### キャッシュ戦略 |
| 105 | + |
| 106 | +データベースへの負荷を軽減し、アプリケーションの応答性を向上させるためには、適切なキャッシュ戦略が不可欠です。 |
| 107 | +本ガイドラインでは、アプリケーションの要件やデータ特性に応じて、効果的なキャッシュ戦略を選択し、実装するための指針を示しています。 |
| 108 | + |
| 109 | +## クラウド(AWS)への踏み込み |
| 110 | + |
| 111 | +より具体的なガイドラインとなるよう特にAmazon Auroraを中心にクラウド特有の考慮事項に焦点を当てています。 |
| 112 | + |
| 113 | +### バージョン管理 |
| 114 | + |
| 115 | +基本的にはLTSを選択することになり、少なくとも3年間はLTSを使用できますが、その後はしばしば強制的なメジャーバージョンアップが要求されることもあります。 |
| 116 | +そう何度も実施する作業ではないので対処に迷いがちなので、今回は特に以下の観点で記載しました。 |
| 117 | + |
| 118 | +* アップグレード計画の策定 |
| 119 | +* アップグレード時の注意点 |
| 120 | + |
| 121 | +### サイジング |
| 122 | + |
| 123 | +アプリケーションの性能要件を満たすためには、適切な RDS インスタンスタイプ(CPU、メモリ、ストレージ)を選択することが重要です。サイジングが不適切だと、以下の問題につながる可能性があります。 |
| 124 | + |
| 125 | +* 性能不足 |
| 126 | +* コストの浪費 |
| 127 | + |
| 128 | +本ガイドラインでは特に以下の点について言及しています。 |
| 129 | + |
| 130 | +* ワークロードの特性(例:OLTP、OLAP)に応じたインスタンスタイプの推奨 |
| 131 | +* 初期サイジングの見積もり方法 |
| 132 | +* 負荷テストの重要性 |
| 133 | + |
| 134 | +### スケーリング戦略 |
| 135 | + |
| 136 | +アプリケーションの負荷変動に対応するため、データベースのスケーリング戦略を事前に検討しておく必要があります。Aruoraでは以下の機能を提供されています。 |
| 137 | + |
| 138 | +* リードレプリカによる読み取り負荷の分散 |
| 139 | +* インスタンスタイプの変更による垂直スケーリング |
| 140 | + |
| 141 | +本ガイドラインでは、以下の点について解説しています。 |
| 142 | + |
| 143 | +* これらのスケーリングオプションの適切な選択と設定 |
| 144 | +* スケーリング時の注意点 |
| 145 | + |
| 146 | +# まとめ |
| 147 | + |
| 148 | +冒頭に記述したとおり、単にPostgreSQLの基本的な機能や設計原則を解説するだけでなく、より実践的で高度なトピックにまで踏み込見ました。 |
| 149 | + |
| 150 | +PostgreSQL自体のupdateやAWSその他クラウドサービスの動向をウォッチしつつ継続的にupdateを行っていく予定です。 |
0 commit comments