オブジェクトストレージ(S3系)— 大きいファイルはDBに入れない
📖 このページのゴール:画像・動画・PDF などの大きいファイルは、DBではなく専用の倉庫(オブジェクトストレージ)に置く、という当たり前を体に入れる。代表サービスと、初心者が必ずやる失敗、その正しい直し方まで。 ← 目次・はじめにへもどる
📦 ひとことのたとえ
オブジェクトストレージ(S3系)= 貸し倉庫(トランクルーム) です。
引っ越しのとき、大きな家具やダンボールを財布の中に入れる人はいませんよね。財布(DB)には小さくて大事なもの(お金・カード=数値や名前)だけ。大きい荷物(画像・動画)は貸し倉庫へ預けます。
そして倉庫に預けたら、財布の中のメモ(伝票)には「A-12番の倉庫に預けた」という場所(=URL)だけを書いておく。荷物そのものは財布に入れない。これがこのページでいちばん言いたいことです。
| 登場人物 | 正体 | 役割 |
|---|---|---|
| 🏢 貸し倉庫 | オブジェクトストレージ(S3 など) | 大きい荷物(ファイル)を預かる |
| 📦 大きい荷物 | 画像・動画・PDF・バックアップ | 倉庫に入れるもの |
| 🧾 伝票のメモ | DB(PostgreSQL など)の1行 | 「倉庫の場所=URL」だけを書く |
🟢 覚え方:ファイルは倉庫、DBには「倉庫の場所」だけ。
🧩 何者?(しくみ)
ふつうのDB(RDBやNoSQL)は「検索して・並べて・つなぐ」のが得意でした。オブジェクトストレージは、そういう器用なことはしません。やることはとてもシンプルです。
- ファイル(ブロブ)に「キー(名前)」を1つ付けて、丸ごと預ける(put)
- あとでそのキーを指定して丸ごと取り出す(get)
たとえば users/42/avatar.png というキーで画像を put すると、同じキーで get できる。ただそれだけ。「赤い画像だけ探して」みたいなクエリ(中身を条件で検索)はできません。 あくまで「名前で出し入れする巨大なロッカー」です。
🧠 ブロブ(Binary Large OBject=バイナリの大きなかたまり)=中身を細かく見ずに「ひとかたまり」として扱うデータ。画像も動画もPDFも、ストレージから見ればただの大きなかたまりです。
アプリ オブジェクトストレージ(貸し倉庫)
┌──────┐ put(キー, ファイル) ┌──────────────────────┐
│ │ ───────────────────▶ │ users/42/avatar.png │ ← キーで出し入れ
│ │ get(キー) │ videos/intro.mp4 │
│ │ ◀─────────────────── │ reports/2026.pdf │
└──────┘ └──────────────────────┘
│
│ ファイルの「URL(場所)」だけを保存
▼
┌──────────────────────────────┐
│ DB(PostgreSQL など) │ avatar_url = "https://.../avatar.png"
└──────────────────────────────┘ ← 中身ではなく“場所”を持つ
向いているのは 画像・動画・音声・PDF・ファイル添付・バックアップ・静的サイトの素材など。さらに、預けたファイルはURL で配信でき、CDN(しーでぃーえん=世界中に置いた配達拠点。近い拠点から速く届けるしくみ)と組み合わせると、世界中のユーザーに速く届けられます。
🛠 代表サービス(実名)
中身は「キーで put/get する倉庫」で共通。提供元と料金体系が違います。
| サービス | 提供元 | ひとこと |
|---|---|---|
| Amazon S3 | AWS | 元祖・定番。「S3系」という言葉自体がこれ由来。迷ったらまずこれ |
| Google Cloud Storage | GCP版のS3。GCPを使うなら自然な選択 | |
| Azure Blob Storage | Microsoft | Azure版。「Blob=ブロブ」が名前に出ている |
| Cloudflare R2 | Cloudflare | 取り出し(エグレス)が無料。よく読まれる画像・動画でコスト差が出る |
| Firebase Storage | Google / Firebase | アプリから直に使いやすい。Firestore(8章)と相性よし |
| Supabase Storage | Supabase | Postgres(02・05章)とセットで使える。姉妹教材もSupabase |
🔧 エグレス(egress=外への持ち出し)=倉庫から取り出して配信した通信量にかかる料金。S3 など多くは「預けるのは安いが、たくさん読まれると取り出し代がかさむ」。R2 はこのエグレスが無料なのが大きな売り。よく見られる画像・動画が多いサービスでは効いてきます。
🔑 最重要の鉄則:大きいファイルはDBに入れない
このページの主役。初心者がほぼ必ずやる失敗であり、ガイド全体でいちばん大事なルールです。
❌ やりがちな失敗
「画像も結局データだし、DBに全部入れちゃえ」——画像や動画のファイルをそのままDBの中に保存してしまう。一見うまく動くので、気づきにくいのが厄介です。
これをやると、こうなります。
- 🐘 DBが肥大する:本来は軽くて速いはずのDBが、巨大ファイルでパンパンに。
- 🐌 遅くなる:1行が重すぎて、ちょっとした読み書きまで遅くなる。
- 💸 高くつく:DBの保存料は倉庫よりずっと割高。容量が増えるほど効いてくる。
- 💾 バックアップが地獄:DBのバックアップが巨大化し、復元も時間がかかる。
✅ 正しいやり方
| 何を置く | どこに | |
|---|---|---|
| 📦 ファイルそのもの | 画像・動画・PDF の中身 | S3系のストレージ |
| 🧾 ファイルの場所 | URL または キー(例:users/42/avatar.png) |
DBにはこれだけ |
つまり、ファイルは倉庫、DBにはURL/キーだけ。DBは「どのファイルが・誰のもので・いつ上がったか」という軽い情報だけを持ち、本体は倉庫に任せる。これでDBは軽く・速く・安いまま保てます。
🟢 迷ったらこの一行:「DBに入れていいのは“場所”。中身(ファイル)は倉庫へ。」
🔒 公開のしかたと、よくある事故
倉庫に預けたファイルを「誰に見せるか」も大切です(姉妹教材のセキュリティと地続き)。
- 🔓 公開バケット(バケット=倉庫の入れ物の単位):URL を知っていれば誰でも見られる。ロゴや公開画像ならOK。
- 🔑 署名付きURL(限定公開)🔧:「このURLは10分だけ有効」のような、期限付きの合鍵を発行する方式。請求書PDFや会員限定の動画など、本人だけに一時的に見せたいファイルに使う。期限が切れればURLは無効になります。
⚠️ 超頻出の事故:バケットをうっかり全公開にしてしまい、本来は本人だけのはずのファイル(ユーザーのアップロード画像・個人情報を含むPDFなど)が世界中の誰でも見られる状態に。ニュースになる情報漏えいの定番パターンです。「このバケットは公開でいい?」を必ず確認しましょう。詳しくは姉妹教材のセキュリティ編へ。
👍 向いている / 👎 向かない
| 内容 | |
|---|---|
| 👍 向いている | 画像・動画・音声・PDFの保存/ユーザーのファイル添付/静的サイトの配信(HTML・CSS・画像)/DBやログのバックアップ置き場 |
| 👎 向かない | 「条件で細かく検索」したいデータ(→ DB)/ファイルの一部だけを書き換える用途(基本は丸ごと入れ替え)/関係でつないで集計したいデータ(→ RDB) |
ざっくり言うと、「丸ごと預けて・丸ごと出す・大きいもの」はストレージ、「条件で探す・つなぐ・更新する」はDB。役割分担です。
🏢 誰が使う?
ほぼ全員です。アプリに「画像をアップロード」「ファイルを添付」「動画を載せる」が1つでもあれば、ほぼ確実に出番があります。
- 👤 個人/スタートアップ:S3・R2・Supabase Storage・Firebase Storage あたりから手軽に開始。
- 🏢 中堅〜大企業:S3 + CDN で大量配信、署名付きURLで限定公開、バックアップ置き場としても活用。
立場が変わっても「ファイルは倉庫、DBにはURL」という基本は同じです。
📝 ことばメモ
- オブジェクトストレージ:ファイル(ブロブ)をキーで put/get する倉庫。検索はしない。
- ブロブ(blob):画像・動画など「ひとかたまりの大きなデータ」。
- バケット:ファイルを入れる倉庫の単位(入れ物)。
- キー:ファイルに付ける名前(例:
users/42/avatar.png)。これで出し入れする。 - エグレス:倉庫から取り出して配信する通信量にかかる料金。R2 は無料。
- CDN:世界中の配達拠点から、近い拠点で速くファイルを届けるしくみ。
- 署名付きURL:期限付きの合鍵URL。本人だけに一時的に見せたいときに使う。
🟢 ひとことで言うと
オブジェクトストレージ(S3系)は大きいファイルの貸し倉庫。画像・動画・PDFはここに put/get、DBにはURL/キーだけを保存します。大きいファイルをDBに入れない——これがガイド最大の鉄則。配信はCDN、限定公開は署名付きURL、全公開の事故にだけ注意。