リレーショナルデータベースの種々の概念と実装技術の探究(資料全11回)

【概要】 リレーショナルデータベースは複数のテーブルで構成され,SQLで操作する.SELECT文にFROM, WHERE, LIKE, GROUP BY, ORDER BY, NATURAL JOIN, ON などを組み合わせることで柔軟な検索や集計が可能である.トランザクションはBEGIN, COMMIT, ROLLBACKのコマンドを使い,複数のデータベース操作を単一のものとして扱う機能であり,データ整合性を保証する.EXPLAINコマンドで実行計画を確認でき,SQLite3 ではOpenRead, Rewindなどのオペコード(操作コード)がどのように処理されるか分析できる.これらの知識で効率的なデータベース設計と最適化が実現できる.これらの話題とその他を11のページ(それぞれ演習を含む)で学ぶ.

大学授業用に作成した資料を更新・改良して公開しています.これらは クリエイティブコモンズ 表示-非営利-継承 4.0 国際ライセンス(CC BY-NC-SA 4.0) で提供しており,事前の許可なく自由に利用できます.条件は著作者表示(BY),非営利目的のみ(NC),同一ライセンスでの再配布(SA)です.

  1. リレーショナルデータベースの基本概念と応用 [HTML], [PDF], [パワーポイント]

    【概要】 リレーショナルデータベースは,複数のテーブルから構成され,各列がデータの属性を表す.リレーショナルデータベースは,複数のユーザやアプリケーションが共有する.リレーショナルデータベースを管理するデータベース管理システムは,データ定義,データ操作,問い合わせ(クエリ)とその最適化,一貫性維持,アクセス権限によるデータ保護などの機能を提供する統合ソフトウェアである.データモデルは,リレーショナルデータベースの基盤となるものであり,実世界情報を体系的に記述するためのフレームワークであり,データ構造の定義規約,操作体系の定義,一貫性保証のための規約体系から構成される.

  2. テーブル定義と一貫性制約

    【概要】 ドメインは,属性が取りうる値の集合であり,リレーションは,複数のドメインの直積集合の有限部分集合である.これらの概念は,リレーショナルデータベースの基本である.リレーショナルデータベースでは,データベースをテーブルの集まりとして記述する.テーブルの本体にはリレーションを格納できるほか,重複値を持つような多重集合も格納できる.データベースが実世界を正確に反映するためには,一貫性制約が必要である.リレーショナルデータモデルでの一貫性制約には,キー制約,外部キー制約,一意制約,非空制約,ドメイン制約,参照整合性制約などがあり,例えば誕生年に「3009」などの実現不可能な値を禁止することでデータの整合性を確保する.リレーショナルデータベース言語の国際標準がSQLである.SQLは平易な英文として読み下すことができるように設計され,データ操作だけでなく,データベーススキーマの定義やトランザクション管理などの機能も提供する.

  3. SQL問い合わせとリレーショナル代数の基礎

    【概要】 リレーショナル代数はリレーショナル・データベースの理論的基盤であり,集合論に基づいている.これは,和集合や差集合などの基本的集合演算と,射影,選択,θ-結合,商などのリレーショナル固有の演算から構成される.θ-結合は重要な概念で,2つのリレーションの直積集合から特定条件を満たす要素のみを選択する演算であり,「R[AiθBj]S」と表記される.SQL問い合わせは,SELECT,FROM,WHERE句を組み合わせて条件を満たすデータを抽出することを特徴とする.θ-結合,はSQLにおいて「SELECT * FROM R, S WHERE R.AiθS.Bj」の形で実現される.データベースの整合性を保証するためにトランザクション機能が重要である.トランザクションは「begin transaction;」で開始し「commit;」で確定する一連の操作を単一のものとして扱い,エラー発生時には「rollback;」によってトランザクション内のすべての変更を取り消すことができる.

  4. テーブルの結合と分解

    【概要】 リレーショナルデータベースでのテーブルの分解は,あるテーブルを属性集合の部分集合による射影で置き換えるプロセスであり,X₁∪X₂∪…∪Xₘ = {A₁, A₂,…, Aₙ}を満たす.情報無損失分解は,分解されたテーブルから元のテーブルが復元可能な分解である.関数従属性はリレーションスキーマの属性間の依存関係を表すものであり,ある属性の値が決まれば別の属性の値が一意に決まる関係である.ボイス・コッド正規形は,任意の関数従属性X→Yについて,Xがスキーマのキーになっていると定義される.ボイス・コッド正規形は更新時異常を解消可能だが,正規化前のテーブルにおける関数従属性を維持できない場合がある.

  5. SQL における LIKE, GROUP BY, ORDER BY, HAVING, COUNT

    【概要】 SQLは,リレーショナルデータベースの標準的言語である.テーブル定義,問い合わせ(クエリ),データ操作などを行う.LIKE演算子を用いたパターンマッチングでは,「%」や「_」のワイルドカード文字と組み合わせることで,「typeの値に'AA'を含む行」や「先頭がBである行」などの柔軟な検索が可能となる.GROUP BY句を用いたデータをグループ化,各グループの行数をCOUNT関数でカウントするなどの集計処理も重要である.例えば,product_nameの値ごとにグループ化して各グループの行数を集計できる.また,HAVING句を用いてグループ化後の集計結果に対して条件を適用することができ,「行数が24を超えるグループのみを抽出」といった処理が可能である.SQLを用いてデータの効率的な抽出と分析ができる.

  6. テーブルの更新とトランザクション

    【概要】 トランザクションは複数のデータベース操作を一つの処理として扱う機能である.BEGIN TRANSACTIONで開始され,これ以降の操作はCOMMITかROLLBACKまで一つの処理単位として扱われる.COMMITはトランザクション内のすべての操作を確定させ,データベースの変更を永続的に反映する.一方,ROLLBACKはトランザクション内のすべての操作を取り消し,データベースをトランザクション開始前の状態に戻す.この仕組みにより,データベース操作の信頼性と一貫性が保証される.トランザクション処理中の変更はジャーナルファイルに一時的に記録され,システム障害時の回復やROLLBACK時に活用される.

  7. データベースの物理構造

    【概要】 SQLの主要な操作としてテーブル定義がある.テーブル定義はSQLのCREATE TABLE文を用いて行い,「create table path (id integer primary key autoincrement, ...)」のように,フィールド名,データ型,制約条件などを指定する.SQLite 3データベースファイルの物理構造を理解することも重要である.SQLite 3の物理構造は,データベースヘッダとデータページで構成され,通常データページのサイズは1024バイト(16進数で0x400)である.SQLiteデータベースの基本的な格納単位はレコードであり,テーブルの1行に相当する.レコードは複数のフィールド値で構成され,バイナリエディタを使用すると,path,val,created_atなどのフィールド値をバイト列として確認できる.

  8. SQL の実行計画

    【概要】 SQL問い合わせ計画はSQL問い合わせがどのように実行されるかを示す計画で,SQL文の前に「EXPLAIN」を付けると表示される.SQLite3では,オペコードと呼ばれるSQLite3の仮想マシンが実行する基本命令の列である.主要なオペコードには,OpenRead(テーブル読み取り用のカーソル作成),Rewind(カーソルをテーブル先頭に位置づけ),Column(レコードの列データ取得),ResultRow(結果行の出力)などがある.カーソルはデータベーステーブル内の特定の位置を指し示すポインタで,オペコードによって操作され,テーブル内の行を順に処理するために使用される.条件付きジャンプはWHERE句の条件処理などに使用されるオペコードの機能で,レジスタの値を比較し,条件が満たされると指定されたアドレスにジャンプする.例えば「Ne 1 15 2」はレジスタ1と2の値が等しくないときにアドレス15へジャンプする.

  9. 二次索引の基礎

    【概要】 データベース処理の性能向上には,二次索引と問い合わせ計画の理解が重要である.二次索引は主索引のキー以外の属性に対して作成される索引で,検索処理を高速化する.一つのテーブルに対して任意の数の二次索引を作成でき,「CREATE INDEX <索引名> ON <テーブル名> (<列名の並び>)」という形式のSQL文で二次索引を作成する.例えば「CREATE INDEX idx1 ON point3(x)」はpoint3テーブルのx列に対する二次索引idx1を作成する.また,「EXPLAIN」を付加したSQL文を実行することでSQL問い合わせ計画を確認でき,SQLite3の問い合わせ計画はOpenRead,Rewind,Column,Nextなどのオペコードから構成され,SQLite3の内部処理を示すものである.二次索引によるデータベース処理の性能向上は,問い合わせ計画で確認できる.

  10. 二次索引の応用

    【概要】 問い合わせ計画はSQL文の実行方法を示すもので,SQlite3では,データベース操作の基本的なオペレータの並びで表現されている.SQLite 3ではEXPLAIN文で確認できる.二次索引はテーブルの検索効率を向上させるためのデータ構造で,特定の列の値に基づいて効率よく検索できるようにする.二次索引はCREATE INDEX文を用いて作成し,テーブル名と列名を指定する.例えばCREATE INDEX idx1 ON point3( x, y )のように記述する.EXPLAIN文により,SQL問い合わせの問い合わせ計画を確認でき,二次索引による問い合わせ計画の変化も確認できる.

  11. 埋め込み SQL

    【概要】 埋め込みSQLは他のプログラム言語内にSQLコードを埋め込むことである.SQLite3は軽量でサーバレスなデータベース管理システムで,単一ファイルに全データを格納する.トランザクションはデータベース操作を一つの単位として扱う機能で,全操作が成功すればコミット,一つでも失敗するとロールバックされ,データ整合性を保つ.