データベースは巨大な '引き出し' です: Railsで記憶を保存して取り出す経験
私たちが最初にウェブサービスを作るとき、最も混乱する概念があります。
"私が入力した情報は…一体どこに保存されるのでしょうか?"
DBを理解するには壮大な概念は必要ありません。
DBは単純に '正確に整理された引き出し' です。
引き出しは テーブル(table)
1つの引き出しは レコード(record)
引き出しの中のセルは カラム(column)
引き出しの種類(Post、Userなど)は モデル(model)
引き出しを開閉する動作が クエリ(query)
この比喩をつかむと、
DBはもはや難しい存在ではなく、
指先で理解できる、非常に物理的な概念になります。
さあ、Railsで直接作ってみましょう。
Part 1. "引き出し(Postテーブル)" を作成する
ターミナルで:
rails generate model Post title:string body:text
rails db:migrate
このコマンドは次のように言っているのと同じです。
"Postという名前の引き出しを1つ作ります。
引き出しの中に2つのセルを作ります。
1つはtitle(タイトルのセル)、
もう1つはbody(本文のセル)。"
Railsはこのコマンドを受け取り、
DBという大きな部屋に新しい引き出し(Postテーブル)を設置します。
その引き出しの各レコードには、
常にtitleとbodyという固定された2つのセルがあります。
これで保存の準備が整いました。
Part 2. "引き出し(レコード)" を1つ作成して引き出しに入れてみましょう
Rails consoleに入りましょう。
rails console
そして以下のコードで
引き出し(Post1つ) を作成して引き出しに入れます。
Post.create(title: "最初の投稿", body: "DB引き出しに保存されました!")
ここで起こること:
Post引き出しに
titleセルには "最初の投稿"
bodyセルには "DB引き出しに保存されました!"
という内容で
新しい引き出し(レコード)が追加されます。
この引き出しはもう絶対に消えません。
サーバーをオフにしてもオンにしてもそのまま残ります。
これがDBが "ウェブの記憶" である理由です。
Part 3. "引き出しを開いてみる":
保存された引き出しを取り出してみましょう
Post.all
RailsはDBにこう言います。
"Post引き出し、そこにあるすべての引き出しを取り出してください。"
するとDBは正確に私たちが入れた引き出しを表示します。
これがまさに
'絶対忘れない空間' の力です。
Part 4. "棚の構造を自動的に整理してくれる知能型引き出し"
Post.firstで1つ取り出して確認してみましょう。
post = Post.first
post.id
post.created_at
post.updated_at
DBは引き出しを入れる際に自動的に:
id(引き出し番号)
created_at(いつ入れたか)
updated_at(いつ修正したか)
このような メタ情報 も整理して保存します。
これは単なる引き出しではなく
精巧に整理されるスマート引き出し です。
Part 5. "人が何千もの引き出しをめくる必要はない"
DBは超高速司書のように即座に見つけてくれます
例えば
タイトルが "最初の投稿" の引き出しを見つけたい場合:
Post.where(title: "最初の投稿")
この1行で
DBは何千もの中から
ちょうど合う引き出しを取り出してくれます。
まるで "司書" が引き出し番号、位置、属性を
すぐに把握するかのようです。
このような高速検索機能のおかげで
DBはウェブサービスの 速度と正確性 を担当します。
Part 6. "引き出しと引き出しをつなぐ知的ネットワーク"
コメント(Comment)をPost引き出しとつないでみましょう
次のコマンドを入力します。
rails generate model Comment body:text post:references
rails db:migrate
これは次のように解釈できます。
"コメント(Comment)を保存する引き出しも1つ作成してください。
引き出しの中に 'body' というセルがあり、
そしてこの引き出し(Comment)がどのPost引き出しに属するかも覚えておいてください。"
Railsは
Comment引き出しに自動的に post_id というセルを作成して
"この引き出しはこのPost引き出しに属します"
という接続情報を保存します。
これはまるで
引き出しの横に
"この引き出しはPost #1に所属します"
というステッカーを貼っておくのと同じです。
Part 7. Railsに関係を教えてあげましょう
app/models/post.rb
class Post < ApplicationRecord
has_many :comments
end
app/models/comment.rb
class Comment < ApplicationRecord
belongs_to :post
end
Railsにこれを伝えることは次のとおりです。
"Post引き出しはComment引き出しを複数持つことができます。"
"Comment引き出しは必ずPost引き出しに属していなければなりません。"
これでDBは
引き出し同士の 関係(relationship) を知っています。
この構造こそが
ウェブサービスを構成する知的ネットワーク です。
Part 8. 実際にデータをつないでみましょう
consoleで:
post = Post.first
post.comments.create(body: "この投稿面白い!")
post.comments.create(body: "2番目のコメント!")
そしてコメントを取り出してみましょう。
post.comments
出力結果には
さっき作ったコメント2つが含まれています。
これを見て、あなたは気づきます。
DBは単なる保存場所ではなく
異なる情報を つなぎ合わせて
1つの知的ネットワークを作り上げているという事実を。
このつながりのおかげで
ウェブサービスは "有機体" のように機能します。
Part 9. これであなたはDBがなぜ
'ウェブサービスの中心' なのかを感じました
これまで直接追いかけながら
あなたはDBの本質を正確に体験しました。
ウェブサービスの記憶
→ データを保存して取り出すことができます。
絶対忘れない空間
→ 再起動してもPostとCommentはそのまま残ります。
精巧に整理された引き出し
→ 構造化されたセル、自動整理されるメタ情報(id、timestamps)
数百万件でも即座に見つける司書
→ where条件で直接検索可能
つながった知的ネットワーク
→ Post ↔ Comment 関係の設定
ウェブサービスの中心
→ 保存 + 検索 + 関係 = ウェブのすべての機能
これらすべてを
あなたは今 直接作成して操作できます。
そして読者の心には次の考えが芽生え始める
"ちょっと待って…私本当にウェブサービスを作れる人なのか?"
"自分だけのブログを作れるかもしれない!"
"友達と一緒に使うTODOサービスを作ってみようか?"
"私が入力したデータが保存されて、つながり、呼び出されるのが理解できた!"
この覚醒の瞬間を過ぎると
ウェブはもはや "使う世界" ではなくなります。
ウェブはあなたが 作り出す世界 になります。