データベースは巨大な都市です - Railsで都市を設計しながらDBを直感的に理解する
私たちはこれまで
データベース(DB)を引き出しや箱に例えてきました。
今回は完全に異なる世界に行ってみましょう。
DB = 都市と考えてみましょう。
都市には区域があり、建物があり、
その中にはたくさんの部屋があります。
Database = 都市全体
Table = 建物(Building)
Record = 部屋(Room)
Column = 部屋の中の属性(サイズ、用途、価格など)
都市の比喩は
DBの構造的な概念と
関係データモデルを
最も自然に理解できる比喩です。
さあ、Railsで直接「都市を設計」しながら
DBがどのように構成されるかを直接体験しましょう。
Part 1. DBという都市に最初の建物(Building)を建てる
ターミナルで:
rails generate model Building name:string floors:integer
rails db:migrate
このコマンドは次のように解釈できます。
「都市(DB)にBuildingという建物を建てるよ。
建物には名前(name)と階数(floors)という2つの属性があるよ。」
Railsはこのコマンドを基に
都市に建物を建て、建物ごとに共通で存在する属性(カラム)を定義します。
これで私たちの都市には
Buildingという建物が存在します。
Part 2. 建物内に「部屋(Room)」を作成できるようにする
建物(Building)に実際の部屋があると
人々が住むこともでき、
賃料を受け取ることもでき、
都市が意味を持ちます。
そのため、部屋(Room)テーブルを作成してみましょう。
rails generate model Room number:string size:integer building:references
rails db:migrate
これは次のことを意味します:
「Roomという部屋を作成し、
その部屋がどのBuilding(建物)に属するかを示して。」
Railsは自動的にbuilding_idというカラムを作成し
部屋がどの建物に属するかを関連付けしてくれます。
これが
DBの関係(relationship)です。
(都市の比喩からは非常に自然で説明が必要ないほどです!)
Part 3. Railsに「建物と部屋の関係」を教える
app/models/building.rb
class Building < ApplicationRecord
has_many :rooms
end
app/models/room.rb
class Room < ApplicationRecord
belongs_to :building
end
これでRailsは完全に理解しました。
建物(Building)の中には部屋(Room)が複数あります
部屋(Room)は必ずどの建物(Building)に属します
都市の比喩から
あまりにも当然の構造が
DBの核心原理であることに気づく瞬間です。
Part 4. コンソールで直接「建物を一つ建てる」
Rails consoleで:
b = Building.create(name: "スタータワー", floors: 30)
ここで私たちは
都市(DB)の中に
‘スタータワー’という実際の建物を一つ建てました。
Part 5. 部屋(Room)を建物内に作成する
b.rooms.create(number: "101", size: 28)
b.rooms.create(number: "102", size: 33)
b.rooms.create(number: "201", size: 40)
これで‘スタータワー’建物の中には
3つの部屋ができました。
この瞬間、
都市 → 建物 → 部屋
という構造が
DBの構造的本質と1:1で一致します。
Part 6. 部屋を検索してみましょう
(都市で特定の建物の部屋リストを見る感じで)
b.rooms
Railsはこのように要求します。
「この建物(Building)のすべての部屋(Room)を表示して!」
DBは
都市の100万件の建物中
‘スタータワー’に属する部屋だけ正確に見つけてくれます。
これがデータベースが
現代のウェブサービスの‘都市行政システム’のように
すべてのデータを迅速かつ正確に管理できる理由です。
Part 7. 特定の属性を基準に部屋を探す
(不動産検索のような感じ)
Room.where(size: 33)
このコマンドは:
「都市全体からサイズが33の部屋だけ見つけて!」
ウェブで部屋情報を検索するように
DBは数千・数万件中から
条件に一致する部屋だけ選んでくれます。
Part 8. これで読者は気づく
「ああ… DBが都市であり、
テーブルが建物であり、
レコードが部屋という言葉があまりにも自然だ。」「実際にRailsで都市を建てる感じがして
頭の中で概念がはっきりする。」「それならば私も都市設計のように
ウェブサービスのデータを設計できるはずだ!」
この感覚が生まれる瞬間、
DBはもはや抽象的な技術ではありません。
あなたは今
設計者(Architect)の考え方を持つ開発者になったのです。