<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>「達人に学ぶDB設計 徹底指南書」タグの記事一覧Python Tech</title>
	<atom:link href="https://tech.nkhn37.net/tag/%E9%81%94%E4%BA%BA%E3%81%AB%E5%AD%A6%E3%81%B6db%E8%A8%AD%E8%A8%88-%E5%BE%B9%E5%BA%95%E6%8C%87%E5%8D%97%E6%9B%B8/feed/" rel="self" type="application/rss+xml" />
	<link>https://tech.nkhn37.net</link>
	<description>Python学習サイト</description>
	<lastBuildDate>Sun, 11 Jan 2026 05:04:28 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0</generator>

<image>
	<url>https://tech.nkhn37.net/wp-content/uploads/2021/01/cropped-lion-normal-clear-1-32x32.png</url>
	<title>「達人に学ぶDB設計 徹底指南書」タグの記事一覧Python Tech</title>
	<link>https://tech.nkhn37.net</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>DB設計時のポイント ~達人に学ぶDB設計 徹底指南書を参考に~</title>
		<link>https://tech.nkhn37.net/database-design-point/</link>
					<comments>https://tech.nkhn37.net/database-design-point/#respond</comments>
		
		<dc:creator><![CDATA[naoki-hn]]></dc:creator>
		<pubDate>Sat, 04 Feb 2023 21:00:00 +0000</pubDate>
				<category><![CDATA[DB]]></category>
		<category><![CDATA[3層スキーマ]]></category>
		<category><![CDATA[DBMS]]></category>
		<category><![CDATA[DOA]]></category>
		<category><![CDATA[ER図]]></category>
		<category><![CDATA[POA]]></category>
		<category><![CDATA[達人に学ぶDB設計 徹底指南書]]></category>
		<guid isPermaLink="false">https://tech.nkhn37.net/?p=6940</guid>

					<description><![CDATA[DB設計時のポイントについて、個人的におすすめな「達人に学ぶDB設計 徹底指南書」に記載されている内容を参考にさせてもらいつつまとめます。 DB設計に関する理解の重要性 私は、某製造メーカーにて生産管理関連のシステムの設 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">DB設計時のポイントについて、個人的におすすめな「<a rel="noreferrer noopener" href="https://www.amazon.co.jp/exec/obidos/asin/4798124702/nkhn37net04-22/" target="_blank">達人に学ぶDB設計 徹底指南書</a>」に記載されている内容を参考にさせてもらいつつまとめます。</p>



<h2 class="wp-block-heading jinr-heading d--bold">DB設計に関する理解の重要性</h2>



<p class="wp-block-paragraph">私は、某製造メーカーにて生産管理関連のシステムの設計・開発・導入をしています。社内SEという立ち位置のため、開発自体は外注することが多いのですが、データの分析や活用の面でDBを扱うことが多いです。主にOracle、後はソフトなどの前提によりSQL ServerやPostgreSQL、MySQL等です。</p>



<p class="wp-block-paragraph">私はDBエンジニアというわけではないのでDBの細かいところは得意というわけではないのですが、社内SEとして開発ベンダーと議論する際や、BI等によるデータ分析や活用を考えたときにDB設計についてしっかりと理解しておくことは非常に重要です。</p>



<p class="wp-block-paragraph">DB設計に関する学習の際には「<span class="marker"><strong>達人に学ぶDB設計 徹底指南書</strong></span>」が特に役に立ちました。</p>





<p class="wp-block-paragraph">この書籍は、DB設計の基本的な内容と共に、バッドノウハウやグレーノウハウといったやってはいけないノウハウについても色々と紹介されています。</p>



<p class="wp-block-paragraph">本記事では、上記書籍にかかれているDB設計のポイントや自分の経験やその他調べて学んだことを加えて整理します。DB設計について気になる方の参考に少しでもなればよいかなと思います。（私自身としてもDB設計について思い出すときや書籍を見直すときのための覚え書きとなればなと思っていたりします）</p>



<p class="wp-block-paragraph">本記事では、特に各種設計の考え方を中心に整理します。書籍を参考にさせていただいていますが、あくまで私が理解した内容を整理するという位置づけですので、細部興味がある方は、上記書籍を読んでみてもらえればなと思います。</p>



<h2 class="wp-block-heading jinr-heading d--bold">DB設計時のポイント</h2>



<h3 class="wp-block-heading jinr-heading d--bold">データベース設計の基本</h3>



<h4 class="wp-block-heading jinr-heading d--bold">DBとDBMS</h4>



<p class="wp-block-paragraph">「<span class="marker"><strong>データベース（DB）</strong></span>」とは、データの集まりを指すために使われる言葉です。一方で「<span class="marker"><strong>データベースマネジメントシステム（DBMS）</strong></span>」とはデータベースを管理するためのシステムのことを言います。</p>



<p class="wp-block-paragraph">私は製造業の社内SEとして働いていますが、製造現場の人と話していたりすると現場の人はExcelで整理された表データをDBと呼んだりします。これまで開発等を経験してきた私からするとDBというのはOracle等のDBMSで管理された正規化されたデータを思いだすので、何となく違和感を感じたりします。ただ、これもデータの集まりということでデータベースといえばデータベースです。</p>



<h4 class="wp-block-heading jinr-heading d--bold">データベースの種類</h4>



<p class="wp-block-paragraph">データベースと一言で言っても色々な種類があります。</p>



<ul class="wp-block-list jinr-list">
<li>リレーショナルデータベース（Relational Database: RDB）</li>



<li>オブジェクト指向データベース（Object Oriented Database: OODB）</li>



<li>XMLデータベース（XML Database: XMLDB）</li>



<li>階層型データベース（Hierarchical Database）</li>



<li>キー・バリュー型ストア（Key-Value Store: KVS）</li>



<li>ドキュメント指向データベース（Document Oriented Database）</li>



<li>列指向型データベース（Columnar Database）</li>



<li>グラフデータベース（Graph Database）</li>
</ul>



<p class="wp-block-paragraph">この中で企業などでいまだに中心的であるのはリレーショナルデータベース（RDB）でしょう。以降で整理する内容はRDBに関連するものが中心になります。</p>



<p class="wp-block-paragraph">キー・バリュー型ストアより下のデータベースは近年のビッグデータや特定領域を対象としたようなデータベースです。本記事では扱いませんが、興味がある方は調べてみてもらえるといいかと思います。</p>



<h4 class="wp-block-heading jinr-heading d--bold">主なDBMS</h4>



<p class="wp-block-paragraph"><span class="marker"><strong>DBMS</strong></span>についてもいくつかの種類があり、RDBに関して代表的なものは以下のようなものがあります。</p>



<ul class="wp-block-list jinr-list">
<li>Oracle Database</li>



<li>SQL Server</li>



<li>DB2</li>



<li>PostgreSQL</li>



<li>MySQL</li>
</ul>



<p class="wp-block-paragraph">私の場合、今現在働いしている職場だと最も使われているのはOracleです。他にも、DB2以外は多少触ったことがあります。</p>



<p class="wp-block-paragraph">Oracle等のメーカー提供の有償DBMSはサポート含めて安心感があるという点があるかなと個人的には思います。一方で、PostgreSQLやMySQLはOSS（Open Source Software）のため無償で使用することができるので便利ですが、問題発生時に自力で解決できるぐらいのノウハウがないと若干不安が残ります。最近はOSSのサポートを提供している企業などもありますので利用を考える必要もあるかもしれません。</p>



<section class="wp-block-jinr-blocks-iconbox b--jinr-block b--jinr-iconbox"><div class="d--simple-iconbox6 ">
			<i class="jif jin-ifont-v2books" aria-hidden="true"></i>
			<div class="a--jinr-iconbox">
<p class="wp-block-paragraph">本サイトで取り上げている Python ではデータベースを扱うためのモジュールが各種用意されています。以下の記事も興味があれば参考にしてください。</p>



<ul class="wp-block-list jinr-list">
<li><a href="https://tech.nkhn37.net/sqlite-basic/" target="_blank" rel="noreferrer noopener">SQLiteの基本的な使い方</a></li>



<li><a href="https://tech.nkhn37.net/python-sqlalchemy-basic/" target="_blank" rel="noreferrer noopener">SQLAlchemyの基本的な使い方</a></li>



<li><a href="https://tech.nkhn37.net/python-cx-oracle-dbaccess/" target="_blank" rel="noreferrer noopener">cx_Oracleを用いたOracleデータベースへのアクセス方法</a></li>



<li><a href="https://tech.nkhn37.net/python-psycopg2-postgresql-dbaccess/" target="_blank" rel="noreferrer noopener">psycopg2を用いたPostgreSQLデータベースへのアクセス方法</a></li>



<li><a href="https://tech.nkhn37.net/python-mysqlclient-dbaccess/" target="_blank" rel="noreferrer noopener">mysqlclientを用いたMySQLデータベースへのアクセス方法</a></li>



<li><a href="https://tech.nkhn37.net/python-pymongo-mongodb/" target="_blank" rel="noreferrer noopener">pymongoを用いたMongoDBの使い方</a></li>



<li><a href="https://tech.nkhn37.net/python-neo4j-graph-database/" target="_blank" rel="noreferrer noopener">neo4jによるグラフデータベースの使い方</a></li>
</ul>
</div>
		</div></section>



<h4 class="wp-block-heading jinr-heading d--bold">DOAとPOA</h4>



<p class="wp-block-paragraph">システム開発時の考え方として、<span class="marker"><strong>データ中心アプローチ（DOA: Data Oriented Approach）</strong></span>と<span class="marker"><strong>プロセス中心アプローチ（POA: Process Oriented Approach）</strong></span>といった考え方があります。</p>



<p class="wp-block-paragraph">その名の通り、データの構造を決めてからプログラム開発を進める方法がDOAで、プロセス（処理＝プログラム）を先に作ってデータを決めていく開発方法がPOAです。POAは時代遅れとみなされており、DOAのデータ中心に進めていくのが近年の主流です。</p>



<p class="wp-block-paragraph">少し脱線しますが、UI（ユーザーインタフェース）についてもオブジェクト指向UIデザインという領域でも、オブジェクト（データ）が決まってUIが決まっていくので、厳密には異なる領域ですが似ているかなという印象を持っていたりします。</p>





<h4 class="wp-block-heading jinr-heading d--bold">3層スキーマ</h4>



<p class="wp-block-paragraph">DB設計で意識して区別しておかなければいけないことがスキーマの概念です。以下の三つのスキーマに基づくモデルを「<span class="marker"><strong>3層スキーマモデル</strong></span>」と言います。</p>



<ol class="wp-block-list jinr-list">
<li>外部スキーマ（外部モデル）：ビュー</li>



<li>概念スキーマ（論理データモデル）：テーブル</li>



<li>内部スキーマ（物理データモデル）：ファイル</li>
</ol>



<p class="wp-block-paragraph">外部スキーマは、システムの利用者やシステムの画面から見たデータベースの姿で、いくつかのテーブルを必要に応じてつなぎ合わせて利用者に見せているものです。DBMS等で扱う<span class="marker"><strong>View</strong></span>がまさに該当するでしょう。</p>



<p class="wp-block-paragraph">概念スキーマは、具体的に一つ一つのテーブル定義のことで、主に開発者が意識する領域で、<span class="marker"><strong>論理設計</strong></span>と呼ばれる設計領域に該当します。テーブル間の関係性を表す<span class="marker"><strong>ER図</strong></span>もこの部分に該当します。</p>



<p class="wp-block-paragraph">内部スキーマは、よりハードウェアに近い世界で、DBMSから見たデータベースです。プログラマでもDB構築をしたことがない人だとよく知らないかもしれませんが、DBの実態はテーブルやインデックスのDBファイルとして格納されています。このDBファイルをどう設計して、どのようにディスク配置するか等の<span class="marker"><strong>物理設計</strong></span>と呼ばれる設計領域に該当します。</p>



<p class="wp-block-paragraph">概念スキーマは、3層の中で間に挟まっているスキーマで、利用者よりの世界（外部スキーマ）とハードウェアよりの世界（内部スキーマ）の間をうまくつなぐための緩衝材のような役割をしています。</p>



<p class="wp-block-paragraph">この3層がうまく分離されていないと画面側の変更が物理設計に影響したり、物理設計の変更が画面に大きく影響したりしてしまい、変更に対する柔軟性がないシステムになってしまいます。このようなことにならないように各スキーマを分離して独立させることを<span class="marker"><strong>スキーマのデータ独立性</strong></span>と言い、概念スキーマはデータ独立性を保証するための役割を担っています。</p>



<h3 class="wp-block-heading jinr-heading d--bold">DBの論理設計</h3>



<p class="wp-block-paragraph">DBの論理設計は、以下の手順で行われます。</p>



<ol class="wp-block-list jinr-list">
<li>エンティティの抽出</li>



<li>エンティティの定義</li>



<li>正規化</li>



<li>ER図の作成</li>
</ol>



<h4 class="wp-block-heading jinr-heading d--bold">エンティティの抽出</h4>



<p class="wp-block-paragraph">エンティティというのは、データベースで扱う実態です。例えば、「顧客」「社員」「会社」「注文履歴」のようなものがあります。これらがテーブルになっていくわけです。</p>



<h4 class="wp-block-heading jinr-heading d--bold">エンティティの定義</h4>



<p class="wp-block-paragraph">エンティティの定義では、それらのテーブルのキーが何で、属性（列）としてどういったものがあるかを決めていきます。</p>



<h4 class="wp-block-heading jinr-heading d--bold">正規化</h4>



<p class="wp-block-paragraph">エンティティ（テーブル）の整合性を確保するためにデータを整理する作業を<span class="marker"><strong>正規化（normalization）</strong></span>と言います。</p>



<p class="wp-block-paragraph">正規化は第１～５までの正規化がありますが第３正規化までは正規化するべきと言われています。</p>



<h4 class="wp-block-heading jinr-heading d--bold">ER図の作成</h4>



<p class="wp-block-paragraph">正規化まで行うとテーブルが複数出来上がってくるのですが、正規化するとテーブルが分割されるので各テーブルの関係性がよく見えなくなってきます。このテーブル間の関係性を表現するのが<span class="marker"><strong>ER図（Entity-Relationship Diagram）</strong></span>になります。</p>



<p class="wp-block-paragraph">DBの論理設計は上記のような手順で行われていきます。正規化やER図については書き出すと長くなるので別で整理してみようかなと思っています。</p>



<h3 class="wp-block-heading jinr-heading d--bold">DBの物理設計</h3>



<p class="wp-block-paragraph">DBの物理設計は、以下の手順で行われます。</p>



<ol class="wp-block-list jinr-list">
<li>テーブル定義</li>



<li>インデックス定義</li>



<li>ハードウェアのサイジング</li>



<li>ストレージの冗長性構成</li>



<li>ファイルの物理配置</li>
</ol>



<h4 class="wp-block-heading jinr-heading d--bold">テーブル定義</h4>



<p class="wp-block-paragraph">テーブル定義は、論理設計のエンティティ定義に内容に近いと思うかもしれませんが、物理設計では具体的に各テーブルの属性（列）がどういった型で、サイズはどうするかといった具体的な物理定義をしていきます。</p>



<h4 class="wp-block-heading jinr-heading d--bold">インデックス定義</h4>



<p class="wp-block-paragraph"><span class="marker"><strong>インデックス</strong></span>（索引）はデータベースの検索の応答性に非常に重要な役割を果たします。</p>



<p class="wp-block-paragraph">その名の通り書籍などの索引と同じで、一部の列または複数の列に対してインデックスを作成すると、検索の性能が大幅に向上します。インデックスはなくても動くのですが、私の過去の経験からも適切にインデックスが張られていないDBを扱うとかなり遅くてストレスを感じますので、非常に重要な設計要素になります。</p>



<h4 class="wp-block-heading jinr-heading d--bold">ハードウェアのサイジング</h4>



<p class="wp-block-paragraph">ハードウェアのサイジングは「データの容量」と「パフォーマンス」という2つの観点があります。</p>



<p class="wp-block-paragraph">DBはDBサーバーを用意して運用することがほとんどですが、サービス開始後のデータ容量増加を見越してストレージのサイズを決める必要があります。また、速度を考慮して、CPUやメモリ、ストレージのI/O速度も意識する必要があります。</p>



<p class="wp-block-paragraph">データベースの性能問題の8割はディスクI/Oに起因するともいわれています。HDDのディスク回転数をどうするかや必要に応じてSSDを選択するといったことも検討が必要です。</p>



<h4 class="wp-block-heading jinr-heading d--bold">ストレージの冗長構成</h4>



<p class="wp-block-paragraph">ストレージの冗長性は、要は<span class="marker"><strong>RAID（Redundant Array of Independent Disks）</strong></span>の事です。RAIDは、複数のディスクをまとめて仮想的に一つのストレージとする技術で、まとまりをRAIDグループと言います。</p>



<p class="wp-block-paragraph">RAIDには主要なもので以下のようなものがあります。</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>レベル</th><th>概要</th></tr></thead><tbody><tr><td>RAID0（ストライピング）</td><td>データを異なるディスクに分散することでI/O性能を向上させる。ただし、1本でもディスクが故障するとデータは失われるため冗長性は全くない。</td></tr><tr><td>RAID1（ミラーリング）</td><td>2本のディスクに全く同じデータを書き込むことで冗長性を確保する。信頼性は向上するが、I/O性能には寄与しない。</td></tr><tr><td>RAID5</td><td>最低3本で構成し、パリティという誤り訂正符号を含めて分散してデータを格納する。分散するのでI/O性能の向上も期待でき、1本までなら故障に耐えられるが、2本同時に故障すると復旧できない。</td></tr><tr><td>RAID6</td><td>RAID5の上位版ともいう方式で、最低4本で構成し、2重に冗長データを生成する。二重に冗長データを生成するのでRAID5より性能が悪くなるが、同時に2本までの故障まで対応できる。</td></tr><tr><td>RAID10（RAID1+0）</td><td>RAID1+0ともいうこともあるRAID0とRAID1を組み合わせた方法。I/O性能と冗長性を両方確保できるいいとこどりの方法だが、コストが高い（最低でも4本HDDが必要）</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">どのRAIDレベルを採用するかは、どの程度費用がかけられるかとどの程度の信頼性を求めるかによるというのが正直なところです。</p>



<p class="wp-block-paragraph">私の所属している企業では、RAID1+ホットスペアということでRAID1の構成に加えて1台待機HDDを用意して1本故障時には自動で再構成して1本のみにずっとなってしまうことを防ぐような構成がよく使われています。また、より信頼性が求められるシステムではRAID5やRAID6等も使われています。</p>



<h4 class="wp-block-heading jinr-heading d--bold">ファイルの物理配置</h4>



<p class="wp-block-paragraph">DBMSが管理するファイルとして設計時に考量するべきファイルとしては、以下のような項目があります。</p>



<ul class="wp-block-list jinr-list">
<li>データファイル</li>



<li>インデックスファイル</li>



<li>システムファイル</li>



<li>一時ファイル</li>



<li>ログファイル</li>
</ul>



<p class="wp-block-paragraph">開発者が中心的に意識するのはデータファイルとインデックスファイルぐらいかと思います。システムファイル、一時ファイル、ログファイルはDBMSが使用するファイルです。</p>



<p class="wp-block-paragraph">システムファイルはその名の通りシステム管理のための情報です。一時ファイルもその名の通り、データを一時的に格納する領域です。SQLでGROUP BYやDISTINCT等を利用するときなどに一時的にデータを展開する領域になります。</p>



<p class="wp-block-paragraph">プログラマでもあまり理解していない人もいますが、DBMSはデータのコミット時に即座にデータファイルを更新しているわけではありません。一旦ログファイルに変更をため込んで、あるタイミングで一括してデータファイルへ変更を反映しています。Oracleでは「REDOログ」、PostgreSQLやSQLServer、DB2では「トランザクションログ」、MySQLでは「バイナリログ」等、DBMSによって呼び方が異なります。</p>



<p class="wp-block-paragraph">ファイルの物理配置では、これらのファイルをどのようにハードウェアに配置するのかを決めます。性能的にはすべての別ディスクに配置した方がI/O性能はよくなります。しかし、ハードウェアコストは非常に高くなります。I/O性能とコストはトレードオフの関係にあります。</p>



<p class="wp-block-paragraph">それほど負荷が高くないシステムであれば全て同じディスクでも問題はないでしょうが、大規模なシステムになったときは費用と相談しながらちょうどよいポイントを探すのが重要になります。</p>



<h3 class="wp-block-heading jinr-heading d--bold">バックアップ設計</h3>



<p class="wp-block-paragraph">バックアップについては、企業のシステムでは非常に重要な設計項目です。ハードウェア故障などの際にデータが永久に失われるようなことがあれば大惨事になるでしょう。</p>



<p class="wp-block-paragraph">バックアップの主要な方式は以下の３つになります。</p>



<ol class="wp-block-list jinr-list">
<li>フルバックアップ（完全バックアップ）</li>



<li>差分バックアップ</li>



<li>増分バックアップ</li>
</ol>



<p class="wp-block-paragraph">それぞれ簡単に内容を整理してみましょう。以降の例では毎日、夜間の0:00にバックアップを取っている例を想定して記載します。</p>



<h4 class="wp-block-heading jinr-heading d--bold">フルバックアップ（完全バックアップ）</h4>



<p class="wp-block-paragraph">フルバックアップ（完全バックアップ）は非常にシンプルで、以下のように毎日全データをバックアップします。</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img fetchpriority="high" decoding="async" width="1152" height="626" src="https://tech.nkhn37.net/wp-content/uploads/2023/02/image-2.png" alt="フルバックアップ（完全バックアップ）" class="wp-image-6955" srcset="https://tech.nkhn37.net/wp-content/uploads/2023/02/image-2.png 1152w, https://tech.nkhn37.net/wp-content/uploads/2023/02/image-2-300x163.png 300w, https://tech.nkhn37.net/wp-content/uploads/2023/02/image-2-1024x556.png 1024w, https://tech.nkhn37.net/wp-content/uploads/2023/02/image-2-768x417.png 768w" sizes="(max-width: 1152px) 100vw, 1152px" /></figure>
</div>


<p class="wp-block-paragraph">フルバックアップは、リカバリする際には、前日のバックアップデータだけで済みます。仮に前日のバックアップが破損していても、その１日前までなら戻せる可能性もあります。</p>



<p class="wp-block-paragraph">フルバックの欠点としては、全データをとる特性上バックアップの時間が長くなる事です。ハードウェアのリソース負荷が高くなりますし、サービス停止時間が長くなる点も問題になる可能性があります。</p>



<h4 class="wp-block-heading jinr-heading d--bold">差分バックアップ</h4>



<p class="wp-block-paragraph">差分バックアップは、ある日にフルバックアップを取得して、その後は<span class="marker"><strong>フルバックアップ時点からの</strong></span>変更分のみのバックアップを取得します。</p>



<figure class="wp-block-image size-full"><img decoding="async" width="985" height="722" src="https://tech.nkhn37.net/wp-content/uploads/2023/02/image-3.png" alt="差分バックアップ" class="wp-image-6956" srcset="https://tech.nkhn37.net/wp-content/uploads/2023/02/image-3.png 985w, https://tech.nkhn37.net/wp-content/uploads/2023/02/image-3-300x220.png 300w, https://tech.nkhn37.net/wp-content/uploads/2023/02/image-3-768x563.png 768w" sizes="(max-width: 985px) 100vw, 985px" /></figure>



<p class="wp-block-paragraph">差分バックアップは、リカバリする際には、フルバックアップ＋前日のバックアップが必要になります。</p>



<p class="wp-block-paragraph">差分バックアップの利点はデータ容量が減ることです。欠点は、リカバリの時に複数ファイルが必要になるので手順が増えて時間がかかる事です。どちらかが破損していた場合に復旧できないという点も欠点になります。</p>



<h4 class="wp-block-heading jinr-heading d--bold">増分バックアップ</h4>



<p class="wp-block-paragraph">増分バックアップは、考え方については差分バックアップと同じです。ある日にフルバックアップを取得して、その後は<span class="marker"><strong>前日からの</strong></span>変更分のみのバックアップを取得します。</p>



<figure class="wp-block-image size-full"><img decoding="async" width="977" height="711" src="https://tech.nkhn37.net/wp-content/uploads/2023/02/image-4.png" alt="増分バックアップ" class="wp-image-6957" srcset="https://tech.nkhn37.net/wp-content/uploads/2023/02/image-4.png 977w, https://tech.nkhn37.net/wp-content/uploads/2023/02/image-4-300x218.png 300w, https://tech.nkhn37.net/wp-content/uploads/2023/02/image-4-768x559.png 768w" sizes="(max-width: 977px) 100vw, 977px" /></figure>



<p class="wp-block-paragraph">増分バックアップは、リカバリする際には、フルバックアップ＋前日までの全てのバックアップが必要になります。</p>



<p class="wp-block-paragraph">増分バックアップでは、バックアップのデータ容量が全ての方式で最小になりますのでディスク容量が限られる場合等に便利です。一方で、リカバリ手順が最も複雑になりますし、一部のデータが破損していた場合に完全に復元できないという点が欠点になります。</p>



<h4 class="wp-block-heading jinr-heading d--bold">どのバックアップ方式を使うべきか</h4>



<p class="wp-block-paragraph">上記で紹介してきたように、フルバックアップ、差分バックアップ、増分バックアップにはそれぞれ利点／欠点がありました。</p>



<p class="wp-block-paragraph">これらの方式では、バックアップコスト（ハードディスク容量・時間など）とリカバリコスト（復旧時間・手順の複雑さ）がトレードオフの関係にあるという特徴があります。</p>



<p class="wp-block-paragraph">方式の検討ポイントとしては以下の点があります。</p>



<ol class="wp-block-list jinr-list">
<li>いつの時点の状態に復旧させるか</li>



<li>バックアップ時間はどれぐらいか</li>



<li>リカバリにかけられる時間はどれくらいか</li>



<li>何世代までデータを残すか</li>
</ol>



<p class="wp-block-paragraph">企業などではどのぐらいのダウンタイムを許容するかという観点でサーバーの投資費用の判断をしたりしますので、上記のような検討が必要です。一方で、小規模なシステムの場合や、システム停止が製造などの実運用に直結しないようなシステムの場合はバックアップは取らないという選択肢もあります。よく検討してちょうどよいポイントを探す必要があります。</p>



<h3 class="wp-block-heading jinr-heading d--bold">リカバリ設計</h3>



<p class="wp-block-paragraph">バックアップ設計とリカバリ設計はセットで実施することが一般的です。</p>



<h4 class="wp-block-heading jinr-heading d--bold">リストアとリカバリとロールフォワード</h4>



<p class="wp-block-paragraph">「<span class="marker"><strong>リストア</strong></span>」と「<span class="marker"><strong>リカバリ</strong></span>」と「<span class="marker"><strong>ロールフォワード</strong></span>」という言葉は厳密に分けて使う必要があります。</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><tbody><tr><td>リストア</td><td>フルバックアップのファイルをデータベースに戻す。</td></tr><tr><td>リカバリ</td><td>差分（または増分）バックアップしたトランザクションログを適用する。</td></tr><tr><td>ロールフォワード</td><td>データベースサーバー内の未バックアップのトランザクションログを適用する。</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">トランザクションログは、DBMS内部にも残っていて最後のバックアップ後に実施されたユーザーの変更分（未バックアップ）が残っています。この未バックアップのトランザクションログを障害直前まで適用することをロールフォワードと言います。</p>



<p class="wp-block-paragraph">リストア→リカバリ→ロールフォワードといった作業をすることで障害発生直前までのデータを復旧できるということになります。</p>



<h2 class="wp-block-heading jinr-heading d--bold">まとめ</h2>



<p class="wp-block-paragraph">DB設計時のポイントについて、個人的におすすめな「<span class="marker"><strong><a href="https://www.amazon.co.jp/exec/obidos/asin/4798124702/nkhn37net04-22/" target="_blank" rel="noreferrer noopener nofollow">達人に学ぶDB設計 徹底指南書</a></strong></span>」に記載されている内容を参考にさせてもらいつつまとめました。</p>



<p class="wp-block-paragraph">私はDBエンジニアというわけではないのでDBの細かいところは得意というわけではないのですが、社内SEとして開発ベンダーと議論する際や、BI等によるデータ分析や活用を考えたときにDBエンジニアと対等に会話できるようにということでDB知識は学んできました。</p>



<p class="wp-block-paragraph">上記書籍にかかれているDB設計のポイントや自分の経験やその他調べて学んだことを加えて整理しています。本記事では、特に各種設計の考え方を中心に整理しましたが、正規化やER図、書籍で紹介されているバッドノウハウやグレーノウハウについては、また別途整理してみると知識の定着になるかなと思っていたりします。</p>



<p class="wp-block-paragraph">なお、より詳細な内容については今回参考にさせていただいた以下の書籍を手に取っていただいて読んでみてもらえるとよいかなと思います。</p>




<section class="b--jinr-block b--jinr-blogcard d--blogcard-hover-up d--blogcard-style1 d--blogcard-mysite t--round "><div class="a--blogcard-label ef">あわせて読みたい</div><a class="o--blogcard-link t--round" href="https://tech.nkhn37.net/python-tech-summary-page/"><div class="c--blogcard-image"><img decoding="async" class="a--blogcard-img-src" width="128" height="72" src="https://tech.nkhn37.net/wp-content/uploads/2024/08/Python-Tech-Pythonプログラミングガイド_new1-640x360.jpg" alt="【Python Tech】プログラミングガイド" /></div><div class="a--blogcard-title d--bold">【Python Tech】プログラミングガイド</div></a></section>]]></content:encoded>
					
					<wfw:commentRss>https://tech.nkhn37.net/database-design-point/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>

<!--
Performance optimized by W3 Total Cache. Learn more: https://www.boldgrid.com/w3-total-cache/?utm_source=w3tc&utm_medium=footer_comment&utm_campaign=free_plugin

Disk: Enhanced  を使用したページ キャッシュ

Served from: tech.nkhn37.net @ 2026-06-11 04:30:13 by W3 Total Cache
-->