Welcome to 1to1(いとい)   Click to listen highlighted text! Welcome to 1to1(いとい)

Datebase

歴史

古代の記録からAI時代のベクトルデータベースまで

データベース技術の進化史:古代の記録からAI時代のベクトルデータベースまで
序文
 個人の記録帳の管理といった身近な課題から、人類社会全体の情報を体系化する試みまで、データを効率的に管理したいという欲求は、時代や規模を問わず存在する普遍的な課題です。紙に記録するだけでは、過去のデータの検索や月別の集計といった単純な作業でさえ、膨大な手間を要します。この根源的な課題を解決するために、古代メソポタミアの粘土版による記録管理から、現代の生成AIを支える最新のベクトルデータベースに至るまで、データベース技術が辿ってきた壮大な進化の歴史を体系的に解説します。各時代における社会や技術の要請が、いかにして新たなデータベースの形態を生み出し、それがどのようなイノベーションによって解決されてきたのかを明らかにすることで、現代社会の根幹を成すこの技術の重要性と未来への展望を考察することを目的とします。

——————————————————————————–
データベース前史:電子計算機以前のデータ管理
 電子計算機、すなわちコンピュータが誕生する遥か以前から、人類は増え続ける情報を体系的に管理し、再利用するための方法を模索してきました。これらの初期の試みは、現代のデータベース技術とは比較にならないほど原始的でしたが、データを構造化し、機械的に処理するという思想の基盤を形成した点で極めて重要です。このセクションでは、後のデータベース概念の萌芽となった歴史的なデータ管理技術を概観します。
古代の記録媒体:粘土版
 人類最古のデータベースと見なせるかもしれない記録媒体は、古代メソポタミアで用いられていた粘土版です。当時、人々は楔形文字を用いて取引記録などを粘土版に刻みつけていました。紙媒体と比較した場合、粘土版は「焼くことで半永久的に保存できる」という顕著な優位性を持っていました。これは、体系的な形で**データ永続性(Data Persistence)という根源的な課題を初めて解決した試みであり、現代のデータベース理論における永続性(Durability)に通じる概念です。そのおかげで、数千年の時を経た現代においても、当時の取引記録が解読され、古代社会の研究に貢献しています。
パンチカードシステムの登場
 19世紀後半になると、データ処理の機械化に向けた画期的な発明が登場します。それがパンチカードシステムです。
 1890年のアメリカ国勢調査において、膨大なデータを効率的に集計するため、ハーマン・ホレリスがこのシステムを開発しました。紙のカードに穴を開け、その穴の有無や位置によって「男性/女性」といった情報を表現するこの仕組みは、後のコンピュータにおける2進法(0と1)の基礎となる概念を内包していました。これは、情報を機械が解釈できる形式に変換するという、データ処理における大きな一歩でした。ホレリスが設立した会社は、後に巨大IT企業であるIBMへと発展しました。パンチカード自体も非常に息の長い技術となり、1970年代までデータ処理の現場で現役として利用され続けました。粘土版による記録の構造化と、パンチカードによる処理の機械化。これらの前史的技術は、データを体系的に扱い、そこから価値を引き出すというデータベースの基本概念の萌芽であり、やがて来る電子計算機の時代への扉を開く重要な布石となったのです。

——————————————————————————–
初期データベースの黎明期:1950年代~1960年代
1950年代に電子計算機が登場すると、データ管理の世界は大きな変革期を迎えました。しかし、初期のコンピュータがもたらした革新は、同時に新たな課題も浮き彫りにしました。特に、データを記録媒体の先頭から順番にしか読み取れないという逐次的なアクセス方法の限界は、初期コンピューティングの潜在能力を著しく阻害するものでした。この非効率性は、より高度で体系的なデータ管理システム、すなわちデータベース管理システム(DBMS)の登場を促す強い圧力となりました。
磁気テープとシーケンシャルアクセスの限界
 初期のコンピュータにおける主要なデータ記録媒体は磁気テープでした。この媒体へのアクセス方法は「シーケンシャルアクセス」と呼ばれ、特定のデータを探すためには、テープの先頭から順番にデータを読み込んでいく必要がありました。例えば、1万件のデータの中から特定の1件を探し出すのに、最悪の場合1万件すべてのデータをチェックしなければならないという非効率性を抱えていました。これは、紙の記録を1枚ずつめくって探すのと本質的に変わらず、コンピュータの計算能力を十分に活かせない大きなボトルネックでした。
階層型データベース
 この課題を解決するため、1960年代に最初の本格的なデータベース管理システム(DBMS)である階層型データベースが登場しました。1966年にIBMが開発した「IMS (Information Management System)」がその代表格です。データを木構造(ツリー構造)で管理する方式で、その構造は家系図に例えることができます。例えば、神社の組織図であれば、頂点に神社があり、その下に「拝殿」「賽銭箱」「お守り売り場」といった子要素が連なります。このモデルの根本的な問題点は、「一つのデータ(子)が複数の親を持てない」という厳格な制約でした。例えば、ある「お守り」が”個”である「拝殿」からも”組織”である「お守り売り場」からも販売されるという関係性を表現しようとしても、どちらか一方にしか所属させることができませんでした。これは現実世界の複雑な関係性を表現する上で、重大な制約となりました。
ネットワーク型データベース
 階層型の構造的制約を克服するために登場したのがネットワーク型データベースです。このモデルでは、一つのデータが複数の親を持つことが許容されたため、網の目のようなより複雑なデータ関係を表現することが可能になりました。 しかし、その柔軟性は構造の複雑化という代償を伴いました。データを取り出すには、データの物理的な格納場所を示す「ポインタ」を迷路のように辿っていく必要があり、プログラミングは極めて困難になりました。当時のプログラマーたちは、この複雑に絡み合った構造を「スパゲッティコード」と呼び、その扱いに大変苦労したと伝えられています。階層型とネットワーク型の両モデルに共通していたのは、「一度設計したデータ構造の変更が非常に困難」という柔軟性の欠如でした。新しい関係性を追加しようとすると、システム全体の大幅な再設計とプログラムの書き直しが必要となり、変化に対応することが難しかったのです。これらの初期データベースモデルが抱えていた硬直性と複雑性は、開発者たちに大きな負担を強いました。この状況が、より柔軟で、直感的で、使いやすい新たなデータベースモデルの登場を必然とし、次の革命への道筋をつけたのです。

——————————————————————————–
関係モデルの革命:リレーショナルデータベースの時代
 1970年、IBMの研究者であったエドガー・F・コッドが発表した論文は、データベースの歴史における真のパラダイムシフトを引き起こしました。彼が提唱した「関係モデル(リレーショナルモデル)」は、データの物理的な格納方法(どう保存されているか)と論理的な構造(どう見えるか)を完全に分離するという画期的な概念を導入しました。これにより、開発者は複雑なデータ構造を意識することなく、必要なデータそのものに集中できるようになり、生産性は飛躍的に向上しました。
関係モデルの誕生とSQL
 リレーショナルデータベース(RDBMS)の核心は、そのシンプルさと数学的な厳密性にあります。
基本構造: 全てのデータを数学の「関係(Relation)」理論に基づき、「表(テーブル)」形式で管理します。これは、多くの人が使い慣れているExcelのシートのように、行と列で構成された単純明快な構造です。例えば、賽銭記録であれば「日付」「金額」「参拝者名」といった列(カラム)を持つ表として定義され、一行一行が一件の賽銭記録を表します。
言語の革新: RDBMSの最大の功績の一つが、SQL (Structured Query Language) という問い合わせ言語の登場です。それ以前のモデルでは、データを取り出すために「どうやって(How)」アクセスするかの手順を細かく記述する必要がありました。しかしSQLでは、開発者は**「何が欲しいか(What)」だけを宣言的に記述すればよく**、データベースシステムが最適な方法を自動的に判断してくれます。例えば、「3月の賽銭の合計金額を知りたい」場合、SQLでは以下のように記述するだけで済みます。

SELECT SUM(金額) FROM 賽銭記録 WHERE 月 = 3

これは、手続き的なコーディングを必要とした階層型やネットワーク型とは比較にならないほどの簡潔さと分かりやすさでした。
主要なRDBMSの登場と市場形成
 コッドの論文発表後、その理論を実装した商用RDBMSが次々と登場し、巨大な市場を形成していきました。1977年に設立されたRelational Software, Inc.(後のOracle社)が、1979年に世界初の商用RDBMSである『Oracle』をリリース。1982年IBMが「SQL/DS」を発表。1984年Sybase社が製品をリリース。
ACID特性による信頼性の確立
 リレーショナルデータベースが金融システムのような高い信頼性が求められる分野で標準となったのは、そのトランザクション処理が「ACID特性」と呼ばれる厳格な原則に基づいているためです。
原子性 (Atomicity): トランザクション(一連の処理)は、「すべて成功」するか「すべて失敗」するかのどちらかであることが保証されます。例えば、100円の賽銭をある賽銭箱から別の箱へ移すという複数ステップの操作は、単一の不可分な単位として扱われます。「元の箱から100円減らす」処理と「新しい箱へ100円加える」処理の片方だけが実行され、お金が消滅したり複製されたりすることはありません。
一貫性 (Consistency): データベースに設定されたルール(制約)が常に守られることを保証します。例えば、「賽銭の金額は0円以上である」というルールが設定されていれば、データベースはマイナス金額をもたらすようなトランザクションを決して許可しません。これは、ソースがユーモラスに指摘するように、神社が参拝者にお金を支払うという矛盾した状態を防ぎます。
独立性 (Isolation): 複数のユーザーが同時にデータベースにアクセスしても、互いの処理が干渉しないことを保証します。これにより、複数の処理が同時に行われても、データが矛盾した状態になることを防ぎます。
永続性 (Durability): 一度正常に完了(コミット)したトランザクションの結果は、システムに障害が発生しても失われないことが保証されます。
 このACID特性によって、RDBMSはデータ管理における「信頼性のゴールドスタンダード」としての地位を確立しました。しかし、その厳格さと一貫性を維持するための仕組みは、次の時代、すなわちインターネットの爆発的な普及によってもたらされる超大規模なデータとアクセスを捌く上で、新たな課題に直面することになります。

——————————————————————————–
インターネットの波とNoSQLの台頭
 2000年代に入り、インターネットが世界中に爆発的に普及すると、データの世界は新たな局面を迎えます。特に、GoogleやAmazon、Facebookといった、日々膨大な量のデータを生成し、世界中から無数のアクセスを受け付ける巨大ウェブサービスの登場は、従来のリレーショナルデータベースが前提としていたスケーラビリティ(規模の拡張性)の限界を露呈させました。この課題に対応するため、RDBMSの厳格なACID特性をあえて緩和し、分散環境での速度と可用性(いつでも利用できること)を優先する「NoSQL」という新しいデータベースの潮流が生まれました。NoSQLの基本概念とBASE特性
 NoSQLは「Not Only SQL」の略であり、特定の一技術を指すのではなく、関係モデル以外のデータベース全般を指す総称です。その多くは、RDBMSのACID特性とは対照的な「BASE特性」と呼ばれる、より緩やかな一貫性モデルを採用しています。
Basically Available (基本的に利用可能): システムの一部に障害が発生しても、システム全体が停止することなく、利用可能な状態を維持します。
Soft State (厳密でない状態): システムの状態は、外部からの入力がなくても時間と共に変化する可能性があり、常に厳密に一貫している必要はないという考え方です。
Eventual Consistency (結果的に一貫性が取れる): データの更新後、すぐにはシステム全体で一貫性が取れていなくても、最終的(Eventually)には一貫した状態に収束するというモデルです
 このBASE特性をソーシャルメディアのアナロジーで説明すると、ある投稿が世界中で拡散された際、各地域のユーザーに見える「いいね」の数は数秒間、わずかに異なるかもしれません。システムは速度と可用性を優先し、全てのカウンターが最終的に正しい合計値に収束することを許容するのです。このモデルは銀行の勘定システムには不向きですが、高速な処理が求められる用途には非常に適しています。
主要なNoSQLデータベースの分類と特徴
 NoSQLには多種多様なモデルが存在しますが、主に以下の4つのタイプに分類されます。
キーバリュー型:
 仕組み: 「キー(鍵)」と「値(バリュー)」という非常にシンプルなペアでデータを保存します。
 特徴: 構造が単純なため極めて高速に動作しますが、キーに基づかない複雑な検索は不得意です。
 製品例: Redis, Amazon DynamoDB
ドキュメント型:
 仕組み: JSONやXMLのような、構造化された文書(ドキュメント)をそのままの形で保存します。
 特徴: 人間が読んでも理解しやすい柔軟なデータ構造を持ち、スキーマ(構造定義)を事前に厳密に決める必要がありません。
 製品例: MongoDB, CouchDB
カラム指向型:
 仕組み: 一般的なデータベースが行単位でデータを保存するのに対し、列(カラム)単位でデータを保存します。
 特徴: 「全ユーザーの平均年齢を計算する」といった、特定の列だけを対象とする集計処理を非常に高速に実行できます。
 製品例: Cassandra, HBase
グラフ型:
 仕組み: データそのものよりも、データ間の「関係性」を表現することに特化しています。
 特徴: SNSの友人関係や鉄道の路線図のような、複雑なネットワーク構造を持つデータの扱いに絶大な強みを発揮します。
 製品例: Neo4j
巨大テック企業が与えた影響
 NoSQL技術の普及において、インターネットを牽引する巨大テック企業の役割は絶大でした。2006年、Googleが自社の分散データベースシステム「Bigtable」に関する論文を、Amazonが同様に「Dynamo」に関する論文を発表すると、業界に大きな衝撃が走りました。さらに2008年には、Facebookが社内で開発したカラム指向型データベース「Cassandra」をオープンソースとして公開。これにより、世界中の多くの企業が最先端の分散データベース技術を無料で利用できるようになり、NoSQLの普及が一気に加速しました。NoSQLの登場は、RDBMSを完全に置き換えるものではありません。むしろ、システムの要件に応じて最適なデータベースを選択するという「適材適所」の考え方をデータベース界にもたらしたという点で、非常に重要な変革でした。この思想は、次のクラウドとNewSQLの時代へと繋がっていきます。

——————————————————————————–
クラウド時代と次世代データベース
 2010年代以降、ITインフラの利用形態は、自社で物理的なサーバーを保有・管理するオンプレミス型から、インターネット経由で必要なリソースを利用するクラウドコンピューティングへと大きくシフトしました。このクラウド化の波はデータベースの世界にも及び、世界中にデータを地理的に分散配置する超大規模データベースの実現を技術的・経済的に可能にしました。この新しい環境が、従来のデータベースの常識を覆す新たなアーキテクチャの創出を強力に後押ししました。NewSQL:スケーラビリティと一貫性の両立
 クラウド時代がもたらした一つの答えが、「NewSQL」と呼ばれる新しいカテゴリのデータベースです。NewSQLは、NoSQLが持つ水平的なスケーラビリティ(サーバーを増やすことで性能を向上させる能力)と、RDBMSが保証する厳格なACID特性を両立させることを目指しています。その代表格が、2012年にGoogleが発表した「Spanner」です。Spannerは以下の革新的な特徴を備えています。
グローバル分散: 世界中に点在するデータセンターにデータを分散して配置することが可能です。これにより、特定の地域で大規模な災害が発生しても、他の地域のデータセンターでサービスを継続できる、極めて高い災害耐性を実現します。
厳密な一貫性の維持: 地理的に遠く離れた場所にデータが分散していながら、RDBMSと同等の厳密なACID特性を保証します。これは、NoSQLの多くが採用した結果整合性とは一線を画す点です。時刻同期技術: 分散システムにおける最重要課題の一つが、各拠点の時刻を正確に同期させることです。Spannerは「GPSと原子時計」を組み合わせることで、世界中のサーバーの時刻をナノ秒単位で完璧に同期させます。この技術的ブレークスルーにより、地球の裏側にあるデータとの間でも矛盾なく、かつ高速にトランザクションを処理することを可能にしました。
AIとの融合:自己チューニングデータベース
 2017年頃からは、データベースとAI(人工知知能)が融合した「自己チューニングデータベース」が登場し始めました。Oracle社のAutonomous Databaseなどがその代表例です。これらのデータベースでは、AIが自律的に次の役割を担います。パフォーマンスの自動最適化、セキュリティパッチの自動適、障害の予測と事前対策。これにより、従来は専門のデータベース管理者が行っていた高度な運用・管理タスクが自動化され、人間はより創造的な業務に集中できるようになります。
ベクトルデータベースとAI検索
 そして2020年代、生成AIの急速な発展とともに「ベクトルデータベース」が大きな注目を集めています。画像、文章、音声といった、従来のデータベースでは扱いにくかった非構造化データを、「ベクトル」と呼ばれる高次元の数値の配列に変換して保存します。ベクトル間の距離を計算することで、「この画像に似ている画像を探す」「この文章と関連性の高い文章を見つける」といった、従来のキーワード検索では不可能だった曖昧な類似性検索を極めて高速に実行できます。この能力は、「特定のキャラクターに似た巫女の画像を探す」といった、明示的なタグではなく抽象的な視覚的類似性に基づいた、直感的で強力なクエリを可能にします。高度な生成AIサービスの裏側では、ユーザーの質問や文脈に関連する情報を膨大な知識ベースから瞬時に探し出すために、このベクトルデータベース技術が活用されています。AI時代において、もはや不可欠な技術基盤と言えるでしょう。代表的な製品には、PineconeやMilvusなどがあります。データベースは、もはや単なるデータの格納庫ではありません。クラウドの力を借りて世界中に広がり、AIと融合することで自律的に動作する、インテリジェントな情報基盤システムへと進化を遂げているのです。

——————————————————————————–

データベースとは

データベースについて

「決まった形式で整理・保存されたデータの集まり(基地)」のことです。
1. データベースの基本イメージ
データベース(Database / DB)は、「データ(Data)」の「基地(Base)」という意味です。 大量のデータをただ保存するだけでなく、後から使いやすいように整理して蓄積したものを指します。身近な例では「電話帳」や「住所録」も、一定のルール(あいうえお順など)で整理されているため、一種のアナログなデータベースと言えます。
2. データベース管理システム(DBMS)
コンピュータ上でデータベースを扱うには、専用のソフトウェアが必要です。これをDBMS(データベース管理システム)と呼びます。 DBMSを使うことで、以下のようなメリットがあります。

  • 同時アクセスの制御: 複数の人が同時にデータを編集しても矛盾が起きないように調整してくれます(例:Aさんの注文処理中に、Bさんが在庫を検索しても問題ないようにする)。
  • データの整合性: 「日付の欄に文字を入れさせない」「IDを重複させない」といったルールを強制し、不正なデータが入るのを防ぎます。
  • 障害対策: システムが故障した際に備えてバックアップを取ったり、データを復旧(リストア)したりする機能があります。
  • セキュリティ: ユーザーごとに閲覧・編集できる権限を管理できます。

代表的なDBMSソフトウェアには、Oracle Database、MySQL、PostgreSQL、SQL Serverなどがあります。
3. リレーショナルデータベース(RDB)
現在もっとも広く使われているのが、データを「表(テーブル)」の形式で管理するリレーショナルデータベース(RDB)です。Excelのシートのようなイメージを持つと分かりやすいです。

  • テーブル(表): データを格納する場所です(例:社員表、商品表)。Excelの1シートに相当します。
  • カラム(列): データの項目です(例:社員ID、氏名、部署)。それぞれの列には「数値」や「文字列」といった型(種類)を決めます。
  • レコード(行): 1件分のデータです(例:田中さんの情報1行分)。

RDBは、複数のテーブル同士を関連付ける(リレーションを持たせる)ことで、複雑なデータを効率よく管理できるのが特徴です。
4. データベースを操作する言語「SQL」
データベースに対して「データをください」「保存してください」と命令するために使う言語がSQL(エスキューエル)です。 プログラマだけでなく、データ分析を行うマーケターなども使用します。
・SELECT(取得)
・INSERT(登録)
・UPDATE(更新)
・DELETE(削除)

5. データベース設計の重要なルール
Excel方眼紙のように自由に書き込むのではなく、データベースには厳格な設計ルールがあります。
・主キー(Primary Key)
・外部キー(Foreign Key)
・正規化(Normalization)

SQL

SQLの「4大命令」とは、データベース内のデータを操作するための4つの主要な命令(SELECT、INSERT、UPDATE、DELETE)のことを指します。これらは専門用語で「DML(データ操作言語)」と呼ばれ、Webサービスや業務システムの開発において最も頻繁に使用されます。
それぞれの役割を、ショッピングサイトや会員管理などの具体例を交えて分かりやすく解説します。
SELECT(取得・検索)
「データを取り出す」命令です。 データベースの中から、条件に合うデータを探して表示します。4つの中で最も頻繁に使われる命令です。

  • 役割: データの読み込み、検索、集計。
  • 具体例:
    • 「商品一覧ページ」を表示するために、全商品のデータを取得する。
    • 「会員検索」で、IDが「A001」の会員情報だけを取り出す。
    • 「売上集計」で、男性客だけの購入金額を合計する。

INSERT(登録・追加)
「新しいデータを追加する」命令です。 テーブル(表)の新しい行としてデータを書き込みます。

  • 役割: データの新規作成。
  • 具体例:
    • 「会員登録」画面で、新しいユーザーの名前やメールアドレスを保存する。
    • 「SNS投稿」で、新しいつぶやきや写真をデータベースに記録する。
    • ショッピングサイトで「注文」が入った際に、注文データを追加する。

UPDATE(更新・変更)
「すでにあるデータを書き換える」命令です。 内容を修正したり、状態を変更したりする際に使われます。

  • 役割: データの編集、修正。
  • 具体例:
    • 会員が「引っ越し」をしたため、住所情報を新しいものに変更する。
    • 商品の「価格改定」を行い、単価を100円から150円に書き換える。
    • 在庫が減った際に、在庫数を書き換える。
  • 注意点: 「どのデータを更新するか(WHERE句)」を指定し忘れると、テーブル内の全データが同じ内容に書き換わってしまうため、注意が必要です。

DELETE(削除)
「データを消去する」命令です。 不要になったデータをテーブルから完全に取り除きます。

  • 役割: データの削除。
  • 具体例:
    • 会員が「退会」したため、そのユーザー情報を削除する。
    • 注文がキャンセルされたため、注文データを消す。
  • 注意点: UPDATEと同様に、対象を指定し忘れると全データが消えてしまうため、慎重な操作が求められます。

これら4つの機能は、システム開発の現場ではそれぞれの頭文字(Create, Read, Update, Delete)を取って「CRUD(クラッド)」と呼ばれることがあります。

SQL命令役割CRUDでの分類イメージ
INSERT追加Create(生成)書き込み
SELECT取得Read(読み取り)閲覧・検索
UPDATE更新Update(更新)修正・編集
DELETE削除Delete(削除)消去

プログラマは、これら4つの命令を組み合わせることで、商品の購入、プロフィールの編集、退会処理といったWebサービスのあらゆる機能を実現しています。

「主キー」と「外部キー」

「主キー」と「外部キー」の関係は、「2つの別々の表(テーブル)を紐付けるための『留め具(ホック)』と『受け具』の関係」とイメージすると分かりやすいです。
部署表と社員表の連携
1. 親となる表:部署表(マスタ)
部署の情報を管理している表です。

部署ID (主キー)部署名
D01営業部
D02開発部
D03総務部
  • 役割: ここでの「部署ID」は、この表の中で唯一無二の存在です(重複してはいけません)。これを主キー(Primary Key)と呼びます。
  • イメージ: 「D01と言えば営業部のこと」と特定するための「背番号」や「名札」のようなものです。

2. 子となる表:社員表
社員がどこに所属しているかを管理する表です。

社員ID (主キー)社員名所属部署ID (外部キー)
E001佐藤D01
E002鈴木D02
E003高橋D01
  • 役割: 「佐藤さんは営業部(D01)所属」ということを表すために、部署表の背番号(D01)を書き込んでいます。この列を外部キー(Foreign Key)と呼びます。
  • イメージ: 別の表(部署表)のデータを指し示す「参照リンク」や「宛先」です。

この2つのキーは、見えない線で繋がっていると考えてください。

  1. 紐付け(リレーション):
    • 社員表の「所属部署ID(外部キー)」は、必ず部署表の「部署ID(主キー)」を指しています。これにより、バラバラの表が繋がります。
  2. 参照整合性(ルールの強制):
    • 存在しないものは入れられない: 社員表の「所属部署ID」に、部署表に存在しない「D99」のような適当な値を入れることはできません(エラーになります)。これを「参照整合性制約」と呼びます。
    • 勝手に消せない: 部署表から「D01(営業部)」を削除しようとしたとき、社員表にD01を使っている人(佐藤さん、高橋さん)がいる場合、勝手に削除できないようにブロックされます。

もし部署名が変わった場合(例:「営業部」→「営業本部」)、部署表(親)の1箇所を書き換えるだけで済みます。社員表に全員分「営業部」と文字で書いてあると、全員分を書き直さなければならず大変だからです。

外部キー: 本体を参照するための「リンク」(社員表のD01)。

主キー: そのデータの「本体」を特定するID(部署表のD01)。

正規化

「データの重複や矛盾をなくすために、表(テーブル)を適切な形に分割・整理すること」です。整理されていないデータは、変更があったときに修正漏れが起きたり、無駄な容量を使ったりします。これを防ぐ手順(第1〜第3正規化)を、「文房具店のレシート(売上データ)」を例に見ていきましょう。
正規化されていない「悪い状態」の表
ある文房具店で、1枚のレシートに複数の商品が印字されている状態をそのまま1つの表に詰め込んだとします。

レシートNo日付店員商品1単価1個数1商品2単価2個数2合計金額
A0014/1山田ペン1001消しゴム501150
A0024/2佐藤ノート2005(空欄)(空欄)(空欄)1000

この表の問題点:

  • 商品が増えるたびに横に列(商品3, 4…)を足さなければならず、システム改修が必要になる。
  • 「商品2」がない場合、空欄(NULL)が無駄に発生する。
  • 「合計金額」は単価×個数で計算できるため、保存する必要がないデータである。

1. 第1正規化(1NF):表の形を整える
「1つのセルには1つの値だけを入れる」「繰り返しの列をなくす」という段階です。
・横に伸びていたデータを縦(行)に並べ直します。
・計算で求められるデータ(「合計金額」など)は、保存せずに削除します。
結果, 見た目はきれいな表になりますが、主キー(注文番号など)が同じ行が複数でき、データが縦に長くなります。

第1正規化後のイメージ

レシートNo日付店員商品コード商品名単価個数
A0014/1山田P01ペン1001
A0014/1山田P02消しゴム501
A0024/2佐藤N01ノート2005

まだ残る問題点 レシートNo「A001」の情報(日付や店員)が2行に重複して記録されています。これではデータが無駄に増えてしまいます。

2. 第2正規化(2NF):主キーの一部に依存するものを分ける
「複合キー(2つ以上の項目の組み合わせで主キーとなるもの)」一部だけで決まる項目を別テーブルに追い出します。
この表の主キーは「注文番号」と「商品コード」の組み合わせ(複合キー)です。
「商品名」や「単価」は、「注文番号」が分からなくても、「商品コード」さえ分かれば特定できます。これを部分関数従属と呼びます,。
このままだと、商品情報が注文のたびに重複して記録され、商品名変更時に大量の修正が必要になるので、「商品コード」で決まる情報(商品名、単価)を切り出して、別の「商品テーブル」を作ります。結果、「注文明細テーブル(誰が何個買ったか)」と「商品マスタ(商品の詳細)」に分かれます。

A. 売上テーブル(レシート情報)

レシートNo日付店員ID店員名
A0014/1E01山田
A0024/2E02佐藤

B. 商品テーブル(商品情報)

商品コード商品名単価
P01ペン100
P02消しゴム50
N01ノート200

C. 売上明細テーブル(誰が何を買ったか)

レシートNo商品コード個数
A001P011
A001P021
A002N015

これで、「ペンの単価が値上げした」という場合でも、Bの商品テーブルだけを直せば済みます。元の表だと、過去の全ての「ペン」が売れた行を修正する必要がありました。

3. 第3正規化(3NF):主キー以外に依存するものを分ける
「主キー以外の項目」によって決まる情報をさらに別テーブルに分けます。
残った「注文テーブル」の中に、「担当者ID」と「担当者名」があるとします。主キーである「注文番号」が決まれば「担当者ID」が決まります。しかし、「担当者名」は「注文番号」に直接決まるというよりは、「担当者ID」が決まることによって間接的に決まります。これを推移的関数従属(または段階的関数従属)と呼びます,。もし担当者が結婚して名字が変わった場合、過去の注文データをすべて修正しなければならず、修正漏れ(矛盾)の原因になります。
 「担当者ID」で決まる情報(担当者名、所属部署など)を切り出して、別の「社員テーブル」を作ります。結果「注文テーブル」には「担当者ID」だけが残り、詳しい担当者情報は「社員テーブル」を参照する形になります。
A’. 売上テーブル(修正後)

レシートNo日付店員ID
A0014/1E01
A0024/2E02

D. 店員テーブル(新規作成)

店員ID店員名所属部署
E01山田営業部
E02佐藤総務部

まとめ:違いのポイント

第1正規化は、「セルの整理」です。Excel方眼紙のような状態を、データベースとして扱える最低限の表形式にします。

第2正規化は、「複合キーの分解」です。「AとBの組み合わせ」が主キーのとき、「Aだけで分かること」や「Bだけで分かること」を別表にします。

第3正規化は、「間接的な関係の分解」です。主キーではない項目(C)が別の項目(D)を決めている場合(C→D)、それを別表にします。

正規化が進むことによるデメリット

テーブル同士の関係が複雑になり、全体像が把握しづらくなる
正規化を進めると、1つの大きな表だったものが複数の小さなテーブルに分割されていきます。 これにより、テーブルの数が激増し、パッと見ただけでは「どのテーブルとどのテーブルが、どういう関係で繋がっているのか」が非常に分かりにくくなります。
対策として「ごちゃごちゃした状態」を整理するために、テーブル同士の関係を線で結んで可視化したER図(Entity Relationship Diagram)を作成する必要が出てきます。
データの取得(検索)が複雑になる
 正規化されたデータベースから、「Aさんの名前」と「所属する学部名」を一緒に表示したい場合、バラバラになったテーブルを結合(JOIN)する必要があります。

  • SQLが難しくなる: データを取り出す際に、単に「SELECT * FROM 表」とするだけでなく、INNER JOINLEFT JOINといった命令を使って、複数のテーブルをくっつける長い命令文を書く必要があります,。
  • 処理のコスト: 毎回テーブルを結合する処理が発生するため、単純な1枚の表から読み込む場合に比べて、システム側の処理手順が増えることになります。

実用上は「第3正規形」までで十分なことが多い
正規化の理論には第1から第6正規形まで存在しますが、実務上のシステム開発においては、「第3正規形」まで行えば十分であるケースがほとんどです。 それ以上に厳密な正規化(第4、第5…)を追求しすぎると、上記の「複雑さ」というデメリットが大きくなり、開発効率やパフォーマンスに見合わなくなることがあります。
正規化のトレードオフ
正規化は「データの矛盾(更新時のミスなど)を防ぐ」ためには必須ですが、やりすぎると「参照(検索)の手間が増える」というトレードオフの関係にあります。

  • 正規化のメリット: データの重複がなくなり、更新時の矛盾やミス(オペレーションミス)を防げる。
  • 正規化のデメリット: テーブル数が増えて構造が複雑になり、データを閲覧・集計するためのSQLが複雑になる,。

したがって、実際の設計では、第3正規形を目安にしつつ、システムの用途に合わせてバランスを考えることが重要です。

インデックス(索引)

インデックスとは、「本の巻末にある『索引』」のようなものです

  • インデックスがない場合(全件検索):
    本に索引がないと、知りたいキーワードを探すために1ページ目から順にページをめくって探さなければなりません。データ量(ページ数)が増えれば増えるほど、探すのに時間がかかります。
  • インデックスがある場合:
    索引があれば、「このキーワードは50ページにある」とすぐに分かり、直接そのページ(データ)にアクセスできます。これにより、膨大なデータの中からでも一瞬で目的のデータを見つけることができます,。

なぜインデックスが必要なのかというと、システムのパフォーマンス(応答速度)を向上させるためです,。
設計のタイミング
インデックスの設定は、データベース設計の後半である「物理設計」の段階で行います,。

  1. 論理設計: どのようなデータを保存するか、テーブル同士の関係(ER図など)をどうするかを決める。
  2. 物理設計: 実際にデータベースソフト(MySQLなど)に実装するための定義(テーブル定義)を行い、この段階でインデックスの設計も行います。
物理設計

データベースの「物理設計」とは、論理設計(ER図の作成や正規化など)で整理されたデータ構造を、実際に特定のデータベース管理システム(DBMS)で動く形に落とし込む工程のことです。
1.テーブル定義(テーブル作成のルール決め)
論理設計で決まったエンティティ(実体)を、実際の「表(テーブル)」として定義します。具体的には以下の項目を決定します。

  • テーブル名・カラム名:
    実際にシステムで使う名前(通常は英語の複数形など)を決めます(例:students テーブル、student_id カラムなど)。
  • データ型(Data Type):
    各カラムにどのような種類のデータを入れるかを厳密に決めます。データベース製品(MySQL, PostgreSQLなど)によって扱える型が異なるため、適切なものを選定します。
    • 整数型(INT, INTEGER): IDや個数など。
    • 文字型(VARCHAR, TEXT, CHAR): 名前や住所など。文字数の上限(例:100文字まで)もこの段階で決めます。
    • 日付型(DATE, TIMESTAMP): 生年月日や登録日時など。
  • 制約(Constraints): データの整合性を保つためのルールを設定します。
    • 主キー(Primary Key): データを一意に特定するための制約。
    • NOT NULL制約: 空データ(NULL)を許容しない設定。基本的にはNULLを持たないように設計するのが望ましいとされます。
    • デフォルト値(Default): データが入力されなかった場合に自動で入れる値。
    • 外部キー(Foreign Key): 他のテーブルとの整合性を保つための制約。

2. インデックス設計(パフォーマンス対策)
インデックス(索引)を作成するかどうか、どのカラムに設定するかを決めます。 インデックスを設定すると、大量のデータから特定の行を検索するスピードが劇的に向上しますが、設定しすぎると書き込み速度が低下するなどの副作用もあるため、検索頻度などを考慮して設計します。
3. その他の物理的な設定
資料には詳細な言及はありませんが、一般的に物理設計では「ハードウェアの選定(サーバーのスペック)」や「ストレージの容量見積もり」、「バックアップ運用(いつ、どのように取るか)」なども考慮に含まれることがあります。

物理設計は、「机上の空論(論理設計)」を「実際に動くシステム(実装)」に変換する作業です。 ここで決めた内容(テーブル名、型、制約など)を元に、CREATE TABLE などのSQL文を書いてデータベースを構築することになります。

データベースの物理設計(実際にテーブルを作る段階)で設定する「制約」

1. 主キー制約 (Primary Key Constraint)
この列でデータを一意(ユニーク)に特定する」という最強の制約です。
具体例: ユーザーID注文番号商品コード
重複したIDが登録されると、システムがどのデータを指しているか分からなくなるため。
2. NOT NULL制約
「この項目は空っぽ(NULL)にしてはいけない」という制約です。 必須項目には必ず設定します。NULLが許容されると、プログラムでの処理が複雑になったり、予期せぬエラーの原因になったりするため、可能な限りこの制約をつけることが推奨されます。
具体例: ユーザー名パスワードログインID
「名前のないユーザー」や「価格のない商品」が登録されるのを防ぐため。
3. 一意制約 (Unique Constraint)
データが重複してはいけない」という制約です。 主キー以外の項目で、重複を許したくない場合に使います。
具体例: メールアドレス電話番号マイナンバー
ID(主キー)は自動連番などで別々だが、同じメールアドレスで別人が2重登録できてしまうのを防ぐため。
4. 外部キー制約 (Foreign Key Constraint)
「他のテーブルに存在する値しか入れてはいけない」という制約です。 データの整合性を保つ(参照整合性)ために非常に重要です。
具体例: 注文テーブルの顧客ID、社員テーブルの部署ID
「存在しない部署ID」を社員に登録してしまったり、顧客データが存在しないのに注文データだけ作られるのを防ぐため。
5. 検査制約 (Check Constraint)
「登録するデータが特定の条件を満たしているかチェックする」制約です。
具体例:
年齢は0以上であること (age >= 0)
価格はマイナスにならないこと (price > 0)
性別は’男’,’女’,’その他’のいずれかであること
システム的にありえない数値(マイナスの年齢など)が誤って登録されるのを防ぐため。

データ型(Data Type)

「データ型(Data Type)」とは、それぞれの列(カラム)にどんな種類のデータが入るか」を指定するルールのことです。これを適切に設定することで、ありえないデータ(年齢に文字が入るなど)を防いだり、検索速度を上げたりできます。
数値型(数を扱う)
計算に使用したり、個数を数えたりするための型です。

  • INTEGER / INT (整数型)
    • 説明: 小数点を含まない整数を扱います。
    • 具体例: ランキングの順位、商品の個数、年齢、ID番号など,。
  • NUMERIC (数値型・小数)
    • 説明: 小数点以下の細かい数値を厳密に扱います。全体の桁数と小数点以下の桁数を指定できます。
    • 具体例: 金利(%)、割引率、体重、通貨(ドルやユーロのセントなど)。
  • SERIAL (連番型)
    • 説明: 新しいデータが登録されるたびに、自動的に「1, 2, 3…」と番号が振られる整数型です。
    • 具体例: 会員番号、通し番号など、自動で採番したいID,。

2. 文字列型(文字を扱う)
名前や文章などを扱う型です。

  • VARCHAR (可変長文字列型)
    • 説明: 文字数に制限を設ける一般的な文字型です。VARCHAR(100)のように最大文字数を指定します。
    • 具体例: ユーザー名、メールアドレス、商品コード、支店コード、住所,,。
  • TEXT (テキスト型)
    • 説明: 文字数制限のない(または非常に長い)文章を扱います。
    • 具体例: ブログの記事本文、商品の詳細説明文、備考欄,。

3. 日付・時刻型(時を扱う)
日時を扱うための専用の型です。単なる文字として保存するよりも、期間計算や日付検索がしやすくなります。

  • DATE (日付型)
    • 説明: 「年・月・日」の情報だけを持ちます。時間は含みません。
    • 具体例: 生年月日、締切日、記念日,,。
  • TIMESTAMP (日時型)
    • 説明: 日付に加えて「時・分・秒」まで記録します。
    • 具体例: ログインした日時、データが更新された日時、注文確定の瞬間,。

4. その他の便利な型
データベース製品(PostgreSQLなど)によっては、以下のような特殊な型も利用できます。

  • BOOLEAN (真偽値型)
    • 説明: 「YESかNOか」「〇か✕か」の2択(TRUE / FALSE)だけを扱います。
    • 具体例:
      • is_active(有効会員か無効会員か)
      • is_published(記事が公開済みか下書きか)
      • has_paid(支払い済みか未払いか),。
  • UUID (ユニークID型)
    • 説明: 全世界で重複しない長いIDを生成して扱います。連番(1, 2, 3…)だと推測されやすい場合などに使われます。
    • 具体例: セキュリティを高めたいユーザーID、セッションID,。
  • JSON / JSONB
    • 説明: データをJSON形式(構造化されたテキストデータ)のまま保存します。
    • 具体例: アプリの細かい設定情報、商品ごとの異なるスペック情報(サイズ、色、重さなどがバラバラな場合)。

物理設計の段階で、これらの型の中から,その項目に最適なものはどれか?」を選定します。

  • 年齢なら INT
  • 名前なら VARCHAR
  • 誕生日なら DATE
  • メルマガ購読可否なら BOOLEAN

このように適切な型を選ぶことが、データベース設計の基本となります。

MWcをフォローする
Translate »
Click to listen highlighted text!