0Pricing
SQL Academy · レッスン

キーと型の選択

BIGSERIALとUUIDの主キーを比較し、TEXTとVARCHAR(n)のどちらを使うか決め、すべての列に適した型を選びます。

「キーと型の選択」はCoddyKit上の無料SQL Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはSQL Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 SQL Academyコースには全4レッスンが含まれています。

主キーの選び方

実際の選択肢は3つあります:

  1. BIGSERIAL — 単調増加する64ビット整数
  2. UUID — 128ビットのグローバル一意値
  3. ナチュラルキー — 現実世界の識別子(メールアドレス、ISBN)

BIGSERIALを選ぶべき場合

ほとんどのアプリケーションでのデフォルトの選択肢です:

  • 小さく(8バイト)、インデックスが高速で、キャッシュ効率がよい
  • 単調増加するため、最近のデータがインデックスの末尾にまとまる
  • URLで読みやすい(例:/posts/42)

UUIDを選ぶべき場合

次の場合はUUIDを選びます:

  • グローバルに一意なIDが必要(複数データセンター、オフラインファーストアプリ)
  • URLからビジネス規模を推測されるようなIDの漏えいを避けたい
  • INSERT前にクライアント側でIDを生成したい

コストは16バイト(BIGINTの8バイトに対して)で、v4 UUIDはインデックスへの挿入をランダム化します。

ナチュラルキーが危険な理由

メールアドレスは変更されます。SKUは名前が変わります。国コードは分割されることがあります。PKにはサロゲートキーを使い、ナチュラルキーにはUNIQUE制約を設定します。

列の型:文字列

ほとんどのテキスト列には、次を使います:

  • VARCHAR(n) — 厳密な上限がある場合(メールアドレス、コード)
  • TEXT — 自由形式の長いコンテンツ
  • CITEXT — 常に大文字と小文字を区別せず比較する場合(メールアドレスなど)

列の型:数値

数値列には、次を使います:

  • IDとカウンターにはBIGINT
  • 金額にはNUMERIC(p, s)
  • 科学計算に限ってREAL/DOUBLE PRECISION

列の型:時刻

時刻の列には、次を使います:

  • イベントにはTIMESTAMPTZ(デフォルト)
  • 暦上の日付にはDATE(誕生日、祝日)
  • 日付を伴わない時刻にはTIME(店舗の営業時間)

Booleanとステータス

列が将来2つを超える状態を取る場合は、booleanよりもステータス文字列+CHECKを優先します:

-- Will probably grow:
status TEXT NOT NULL CHECK (status IN ('draft','published','archived'))

-- vs the trap of "is_published BOOLEAN" when you later need a third state.

制約も合わせて定義する

すべての列には次を設定します:

  • 要件に適合する最も狭い型
  • NULLに意味がない限りNOT NULL
  • ほとんど同じ値になる列にはDEFAULT
  • ドメイン上のルールがある場合はCHECK
  • WHERE/JOIN/ORDERで使う場合はインデックス

ストレージへの影響

狭い型 = 小さい行 = 1ページあたりの行数増加 = キャッシュヒット率向上です。TEXTからVARCHAR(20)に変えても、同じストレージを使うため容量は節約できません。BIGINTからINTに変えると、列の幅は半分になります。

外部キーの型は一致させる必要がある

FK列の型は、参照先のPKの型と完全に一致していなければなりません:

-- Wrong (silently won't use the index efficiently):
user_id INT REFERENCES users(id)   -- where users.id is BIGINT

-- Right:
user_id BIGINT REFERENCES users(id)

まとめ

型の選択は設計そのものです。

  • PKにはBIGSERIALまたはUUID
  • 金額にはNUMERIC
  • イベントにはTIMESTAMPTZ
  • 変化するステータスにはTEXTとCHECKの組み合わせ
  • デフォルトではNOT NULL

クイックチェック

複数のタイムゾーンにいるユーザーのイベント時刻を保存します。どの型を使いますか?

よくある質問

「キーと型の選択」レッスンは無料ですか?

はい。「キーと型の選択」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、SQL Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 SQL Academyコースには全4レッスンが含まれています。

「キーと型の選択」で何を学びますか?

BIGSERIALとUUIDの主キーを比較し、TEXTとVARCHAR(n)のどちらを使うか決め、すべての列に適した型を選びます。 ブラウザで直接実行するハンズオンコードでSQL Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

SQL Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのSQL Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。

「キーと型の選択」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このSQL Academyレッスンでコードを書いて実行できますか?

はい。すべてのSQL Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. ブログのモデリング:ユーザー、投稿、コメント
  2. キーと型の選択
  3. 一般的なクエリ向けインデックス
  4. テストデータによるデータベースのシード
← SQL Academyに戻る