関係データベース:教材を選び、集計の単位を確かめる
実行できる問い合わせでも、別の問いに答えていることがあります。数える実体、結合する関係、欠測の意味を先に定義します。無料の設計入門から広いシステム参照へ進み、必要なときだけ数学的な理論書を加えます。
学習順路・例題の編集責任:University Reading List編集プロジェクト。 編集と選定の方法 · 出典確認日:
対象と編集責任
関係設計と問い合わせの意味を学ぶ学部向け順路で、本番管理手順ではありません。例はSQLite3を用い、SQLite3.51.0のメモリー内データベースで確認しました。全行は創作です。著者公開草稿は後の理論用で、初学者用SQLマニュアルではありません。
出発点を選ぶ
三冊を比較する
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はゼロ?
欠測と値ゼロ、予約関係の不存在は別です。置換前に出力規則を明記します。
成果物を作る六つの段階
準備できた成果物: 0 / 6
自己記録用のチェックであり、評価ではありません。チェック情報は当サイトに送信されません。
-
行の単位を選ぶ
読む範囲: Watt7–10、システム書2章。
作るもの: 部屋・予約・タグを描き一行の意味を記述。
確認すること: 部屋IDと予約IDは同じ計数単位ではありません。
-
依存関係を宣言
読む範囲: Watt11–12と関係設計章。
作るもの: キー、関数従属性、分解の根拠を小さな台帳で書く。
確認すること: 三行の偶然ではなく、強制する領域規則を述べます。
-
結合を予測
読む範囲: Watt15–16、システム書4.1。
作るもの: 集計前のLEFT JOIN全行を手書き。
確認すること: CのNULL拡張行と、同じ人数でも別のA予約を残します。
-
分母を選ぶ
読む範囲: システム書3.6–3.7、SQLite参照。
作るもの: 部屋別に三つの個数と合計を解釈。
確認すること: 数え方ごとに別の問いがあり、実行成功は説明を代替しません。
-
重複度を調べる
読む範囲: 追加問題と理論伴読。
作るもの: タグ結合後の粒度を追い、正当な同値を消さず修復。
確認すること: 各結合の行数を確認。DISTINCTは一般的修復法ではありません。
-
再現可能なメモ
読む範囲: 弱点を補う教材に戻る。
作るもの: スキーマ前提、方言、入力、問い合わせ、出力、反例を保存。
確認すること: 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の意味論を使います。
- Aは二予約に対応し、四出力は2,2,2,4。SUM(DISTINCT seats)は2となり、正当な繰り返しを消します。
- Bは予約3に対応し1,1,0,NULL。予約は存在しても既知の人数がなく、SUMは非NULL入力がないためNULLです。
- CにはNULL拡張行一つが作られ1,0,0,NULL。COUNT(*)の1は予約数ではありません。
- 無予約をゼロ表示する規則を採るとしても、すべての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が二行、予約2が一行で、Aの結合行3、単純合計2+2+2=6。予約自体は二件、既知人数は4です。
- タグを予約別一行へまとめ、件数2と1を作ってから一意の予約へ結合。Aの予約2、人数4、タグ3を保ちます。
- SUM(DISTINCT seats)は2で誤り。予約を先に集約しても、後の多側結合が再複製すれば直りません。
解答と解釈
予約の測定を足す時に一予約一行を保つか、部屋別の予約・タグ集計を別々に作り一対一で結合します。
結果を検証する
中間行を示してAの2/4/3を確認。タグはBの欠測人数を測ったことにはなりません。
よくある誤り
行と実体の混同
結合行は自動的に顧客・予約・部屋一件ではありません。先に粒度を決めます。
規則なしのNULL置換
COALESCEは明示した表示規則を実装できますが、欠けた測定を発見できません。
標本を制約の証明とする
標本の一意性や成功した実行だけではキー・依存関係・全状態での正しさは証明できません。
次に進む前に
- 全出力列と行粒度を説明できる。
- 未対応、欠測、測定ゼロを区別できる。
- 誤った結合やDISTINCT修復への反例を作れる。
出典と版の確認
出典確認日:
- BCcampus: Database Design second-edition contents and access
2014年第二版、章と公式無料入口を確認。課題は本サイト独自です。
- Authors: Database System Concepts, seventh-edition identity
著者が第七版、2019年、ISBNを確認。公開付録を全本文と呼びません。
- Authors: seventh-edition contents
関係言語、設計、トランザクションの章を著者目次で確認。
- Authors: Foundations of Databases online draft
既存の著者草稿という識別を保持。接続失敗から新年・紙ISBN・再利用許可を推測しません。
- SQLite: built-in aggregate semantics
COUNTとSUM/NULLは公式仕様で確認。
- SQLite: SELECT and join processing
LEFT JOINのNULL拡張は公式SELECT資料で確認。本番操作手順ではありません。
提案する学習活動であり、公式の課題や全巻通読の主張ではありません。