『達人に学ぶ DB 設計 徹底指南書』でデータベース設計の論理と物理を考える

『達人に学ぶ DB 設計 徹底指南書』 はリレーショナルデータベース (RDB) の設計についての解説書です. 『達人に学ぶ SQL 徹底指南書』 の続編という位置づけのようなので, 本書に登場する SQL が難しいと思ったり, より SQL のことを学びたいと思ったら前作を読むと良いでしょう. 本書ではデータベースの設計を, エンティティの定義や正規化などを行う論理設計と, データ格納の方法や場所を考える物理設計の二段階に分けて説明します. 設計についての基本的な考え方や知識を抑えつつ, やってしまいがちなバッドノウハウや, 論理設計と物理設計のトレードオフと言った実践的な内容にも踏み込みます. 正規化 データベース設計は大きく論理設計と物理設計という二段階に分かれる. 最初に行う論理設計では, 特定の DBMS(Database Management System) や SQL のことは考えずに, プログラムが扱う対象となる物事の属性や物事同士の関係をモデル化する. 論理設計をするに当たって役に立つのが, データの冗長性や非一貫性を排除するための正規化という方法だ. 正規化を理解するには正規化されていないデータを題材にすると分かりやすい. 例えば以下のテーブルは, 都道府県, 市町村, 市町村の規模を表している. このように分割しておけば先に挙げた問題は起きない. 1 2 3 4 5 6 7 8 9 10 +-----------+-----------+-----------+-----------+-----------+--------+ | pref_code | pref | city_code | city | area_code | area | +-----------+-----------+-----------+-----------+-----------+--------+ | 01 | Aomori | 01 | Hirosaki | 01 | Large | | 01 | Aomori | 02 | Hatinohe | 01 | Large | | 01 | Aomori | 03 | Misawa | 03 | Small | | 02 | Yamaguchi | 04 | Ube | 01 | Large | | 02 | Yamaguchi | 05 | Kudamatsu | 02 | Middle | | 02 | Yamaguchi | 06 | Mine | 03 | Small | +-----------+-----------+-----------+-----------+-----------+--------+ このテーブルには 01 Aomori のように何度も登場するデータがあって冗長だ....

May 5, 2023 · 5 min

『SQL パズル』は楽しさと実用を兼ねた SQL 例題集

『SQL パズル 第 2 版 プログラミングが変わる書き方/考え方』 は SQL 問題集です. 収録数 75 問という圧巻の豊富さです. 具体的で実用的な題材によって, 問題へのアプローチの仕方や SQL の奥深さを知ることができます. タイトルには「パズル」とありますが, 本書は決してパズルのためのパズル本ではありません. あくまでも実用的な SQL を学ぶことを目的としているので, 実務にも大いに役立つでしょう. 一部まさにパズル的な問題もありますが, それは SQL の幅広さを知る小休止的なものだと思いました. 本書を読まれる方には副読本として 訳者ミックさんのサポートベージ をおすすめします. 以下印象に残った問題をいくつか紹介します. パズル 1 「会計年度テーブル」 会計年度を持つ以下のようなテーブルがあります. 1 2 3 4 5 CREATE TABLE FiscalYears ( fiscal_year INTEGER, start_date DATE, end_date DATE ); このテーブルは, 各会計年度がいつ始まっていつ終わるのかを格納します. 会計年度は 10/1 から 9/30 までのアメリカ方式とします. 例えば以下のようなデータが入っています. 1 2 3 4 fiscal_year | start_date | end_date -------------+------------+------------ 2021 | 2020-10-01 | 2021-09-30 2022 | 2021-10-01 | 2022-09-30 さて, 問題は「テーブルに不正な値が入らないように制約を付ける」です....

May 18, 2022 · 9 min

『達人に学ぶ SQL 徹底指南書』で SQL の可能性を知る

本書は SQL 初心者から中級者への架け橋となる本です (達人に学ぶ SQL 徹底指南書 第 2 版 初級者で終わりたくないあなたへ (翔泳社)). 本書の目玉となる case 式やウィンドウ関数を始めとした便利な道具を使いこなすための説明 + 練習問題に加え, SQL の理論的なバックグラウンドや歴史的経緯にも触れて, SQL がなぜそうなっているのかの疑問にも答えます (なぜループや変数がないのか, なぜ NULL 関係の動作が非直感的で複雑なのかなど). 基本的な構文は一通り分かったけど, 更に脱初心者を目指して学びを深めたい方におすすめです. 本記事では本書で挙げられた便利な道具について触れていきます. case 式 case 式は条件分岐を記述するための構文です. 1 2 3 4 CASE WHEN [predicate] THEN [value] WHEN [predicate] THEN [value] ELSE [value] END 例を見ると分かりやすいです. テスト用にテーブルを作ります. ヤギのデータです. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 create table goats ( id int PRIMARY KEY, weight INT UNSIGNED, birthday DATE, color VARCHAR(1), name VARCHAR(10)); insert into goats values(1, 63, '2016-03-02', 'W', 'Alice'); insert into goats values(2, 79, '2012-06-25', 'W', 'Bob'); insert into goats values(3, 76, '2020-02-01', 'W', 'Carl'); insert into goats values(4, 75, '2022-11-27', 'W', 'Dan'); insert into goats values(5, 70, '2014-08-29', 'B', 'Elie'); insert into goats values(6, 69, '2013-06-07', 'B', 'Fai'); insert into goats values(7, 67, '2013-01-16', 'B', 'Gabi'); insert into goats values(8, 63, '2014-05-14', 'B', 'Helen'); 1 2 3 4 5 6 7 8 9 10 11 12 13 select * from goats; +----+--------+------------+-------+-------+ | id | weight | birthday | color | name | +----+--------+------------+-------+-------+ | 1 | 63 | 2016-03-02 | W | Alice | | 2 | 79 | 2012-06-25 | W | Bob | | 3 | 76 | 2020-02-01 | W | Carl | | 4 | 75 | 2022-11-27 | W | Dan | | 5 | 70 | 2014-08-29 | B | Elie | | 6 | 69 | 2013-06-07 | B | Fai | | 7 | 67 | 2013-01-16 | B | Gabi | | 8 | 63 | 2014-05-14 | B | Helen | +----+--------+------------+-------+-------+ ヤギの体重が基準値に収まっているかどうかを調べることを考えます....

March 12, 2022 · 10 min