学習ガイド /

関係データベース:教材を選び、集計の単位を確かめる

実行できる問い合わせでも、別の問いに答えていることがあります。数える実体、結合する関係、欠測の意味を先に定義します。無料の設計入門から広いシステム参照へ進み、必要なときだけ数学的な理論書を加えます。

科目・テーマ: データベース

学習順路・例題の編集責任:University Reading List編集プロジェクト。 編集と選定の方法 · 出典確認日:

対象と編集責任

関係設計と問い合わせの意味を学ぶ学部向け順路で、本番管理手順ではありません。例はSQLite3を用い、SQLite3.51.0のメモリー内データベースで確認しました。全行は創作です。著者公開草稿は後の理論用で、初学者用SQLマニュアルではありません。

出発点を選ぶ

無料で設計を始めたい

Watt/Engで実体、関係、キーと正規化を学び、小さいデータでSQLを確認します。方言を明記します。

システム全体の参照書が必要

第七版の関係言語と設計から入り、保存、処理、トランザクションを後に選びます。

問い合わせの形式的根拠を知りたい

離散数学と論理の後にFoundationsを使います。現行製品の操作説明とは目的が違います。

三冊を比較する

Database Design

Adrienne Watt; Nelson Eng · 版: 2 · 2014

無料の設計主教材

選ぶ場面
実体から依存関係と表への読みやすい順路が必要。
別の教材が適する場面
高度な同時実行や全SQL方言を一冊に求める場合。
読む範囲
第二版7–12章、次に15–16章。実体の区別が曖昧なら前のモデル章へ。
限界と注意点
BCcampusの2014年版とSQL追加を確認。例の慣習を全現行エンジンへ移せません。

選ぶ前に試す

部屋、予約、タグのキーと関係ごとの生成行数を指定します。

確認すること: 一予約に複数タグが付くなら結合で粒度が変わります。名前だけで一対一とは言えません。

公式の無料教材 ↗

書誌情報と入手方法 →

Database System Concepts(データベースシステム概論)

Abraham Silberschatz; Henry F. Korth; S. Sudarshan · 版: 7 · 2019

関係言語とシステムの参照

選ぶ場面
設計だけでなく問い合わせやトランザクションも授業で扱う場合。
別の教材が適する場面
短い設計導入だけが必要、または公開付録が全本文だと思う場合。
読む範囲
第七版2–4、6–7章。関係モデルの後に17章のトランザクション。
限界と注意点
著者は2019年3月とISBN9780078022159を確認。公開目次・スライドと本文利用権は別です。

選ぶ前に試す

3.6–3.7と4.1の後、例の三種類のCOUNTとSUMを先に予測します。

確認すること: 予約がない部屋と、人数が不明な予約は、SUMがどちらもNULLでも違います。

書誌情報と入手方法 →

Foundations of Databases

Serge Abiteboul; Richard Hull; Victor Vianu · 版: Complete authors’ online draft

形式的問い合わせの伴読

選ぶ場面
関係設計を理解し、表現力や依存関係を論証したい場合。
別の教材が適する場面
最初のSQL、製品設定、重複保持SQLと集合の無条件同一視が必要な場合。
読む範囲
公開草稿の関係モデル・問い合わせ・依存関係を探します。未確認の現行章番号は指定しません。
限界と注意点
選定対象は著者草稿で、新しい紙版を確認したわけではありません。今回の接続は失敗したため、実際の利用可否を確認し、主線にはアクセス可能なWattを使います。

選ぶ前に試す

小さい問い合わせを集合で表し、SQLが同じ行を残す場合に何が変わるか書きます。

確認すること: 集合の所属と重複度、NULLと普通の値を区別します。同値の主張には意味論の前提が必要です。

公式の無料教材 ↗

書誌情報と入手方法 →

準備を確認する

キーは何を示す?

宣言した制約の下で行を識別します。標本で値が違うだけでは全許可状態のキーを証明しません。

LEFT JOIN後のCOUNT(*)は?

未対応の左行に作るNULL拡張行も数えます。対応記録なら非NULLの右側IDを数えます。

NULLはゼロ?

欠測と値ゼロ、予約関係の不存在は別です。置換前に出力規則を明記します。

成果物を作る六つの段階

自己記録用のチェックであり、評価ではありません。チェック情報は当サイトに送信されません。

  1. 行の単位を選ぶ

    読む範囲: Watt7–10、システム書2章。

    作るもの: 部屋・予約・タグを描き一行の意味を記述。

    確認すること: 部屋IDと予約IDは同じ計数単位ではありません。

  2. 依存関係を宣言

    読む範囲: Watt11–12と関係設計章。

    作るもの: キー、関数従属性、分解の根拠を小さな台帳で書く。

    確認すること: 三行の偶然ではなく、強制する領域規則を述べます。

  3. 結合を予測

    読む範囲: Watt15–16、システム書4.1。

    作るもの: 集計前のLEFT JOIN全行を手書き。

    確認すること: CのNULL拡張行と、同じ人数でも別のA予約を残します。

  4. 分母を選ぶ

    読む範囲: システム書3.6–3.7、SQLite参照。

    作るもの: 部屋別に三つの個数と合計を解釈。

    確認すること: 数え方ごとに別の問いがあり、実行成功は説明を代替しません。

  5. 重複度を調べる

    読む範囲: 追加問題と理論伴読。

    作るもの: タグ結合後の粒度を追い、正当な同値を消さず修復。

    確認すること: 各結合の行数を確認。DISTINCTは一般的修復法ではありません。

  6. 再現可能なメモ

    読む範囲: 弱点を補う教材に戻る。

    作るもの: スキーマ前提、方言、入力、問い合わせ、出力、反例を保存。

    確認すること: NULLと重複が再現できても同時実行・速度は別の主張です。

解答付きの例題

創作SQL例:未対応と未知の値は違う

部屋はA,B,C。予約(id,room,seats)は(1,A,2),(2,A,2),(3,B,NULL)、Cは予約なし。LEFT JOIN後のCOUNT(*)、COUNT(booking.id)、COUNT(booking.seats)、SUM(booking.seats)を部屋別に求めます。

前提

予約IDは一意で非NULL。seatsのNULLは人数不明で、取消やゼロではありません。台帳はこの例で完全、実行中の変更なし。Aの等しい二値を保持し、SQLite3の意味論を使います。

  1. Aは二予約に対応し、四出力は2,2,2,4。SUM(DISTINCT seats)は2となり、正当な繰り返しを消します。
  2. Bは予約3に対応し1,1,0,NULL。予約は存在しても既知の人数がなく、SUMは非NULL入力がないためNULLです。
  3. CにはNULL拡張行一つが作られ1,0,0,NULL。COUNT(*)の1は予約数ではありません。
  4. 無予約をゼロ表示する規則を採るとしても、すべてのNULL合計をゼロにすればBの未知を偽の測定にします。

解答と解釈

指定順でA:(2,2,2,4)、B:(1,1,0,NULL)、C:(1,0,0,NULL)。列の意味を説明してから予約数・人数と呼びます。


            WITH room(room_id) AS (VALUES ('A'), ('B'), ('C')),
booking(id, room_id, seats) AS (
  VALUES (1, 'A', 2), (2, 'A', 2), (3, 'B', NULL)
)
SELECT r.room_id, COUNT(*) AS joined_rows,
       COUNT(b.id) AS bookings, COUNT(b.seats) AS known_counts,
       SUM(b.seats) AS seats
FROM room AS r
LEFT JOIN booking AS b ON b.room_id = r.room_id
GROUP BY r.room_id
ORDER BY r.room_id;
          

結果を検証する

単一SQL文を空のSQLiteセッションで実行。BをNULLから0に変えると既知数1、合計0、予約数1。未知とゼロの差を確認します。

前提を変えて考える

追加問題:説明行が測定値を増やす

同じ予約へタグ(1,red),(1,blue),(2,red)を追加。集計前にLEFT JOINするとAはどうなり、予約の測定を保ったままタグ数を付けるには?

  1. 予約1が二行、予約2が一行で、Aの結合行3、単純合計2+2+2=6。予約自体は二件、既知人数は4です。
  2. タグを予約別一行へまとめ、件数2と1を作ってから一意の予約へ結合。Aの予約2、人数4、タグ3を保ちます。
  3. SUM(DISTINCT seats)は2で誤り。予約を先に集約しても、後の多側結合が再複製すれば直りません。

解答と解釈

予約の測定を足す時に一予約一行を保つか、部屋別の予約・タグ集計を別々に作り一対一で結合します。

結果を検証する

中間行を示してAの2/4/3を確認。タグはBの欠測人数を測ったことにはなりません。

よくある誤り

行と実体の混同

結合行は自動的に顧客・予約・部屋一件ではありません。先に粒度を決めます。

規則なしのNULL置換

COALESCEは明示した表示規則を実装できますが、欠けた測定を発見できません。

標本を制約の証明とする

標本の一意性や成功した実行だけではキー・依存関係・全状態での正しさは証明できません。

次に進む前に

  • 全出力列と行粒度を説明できる。
  • 未対応、欠測、測定ゼロを区別できる。
  • 誤った結合やDISTINCT修復への反例を作れる。

出典と版の確認

出典確認日:

提案する学習活動であり、公式の課題や全巻通読の主張ではありません。

編集と選定の方法 →