JSONデータパターンからUNIQUE制約を生成する

コンバーターがJSON内の一意なフィールドを検出しSQL UNIQUE制約を生成する方法を学びます。単一カラムおよび複数カラムのユニークインデックスを解説。

Constraints

詳細な説明

ユニーク制約の検出

UNIQUE制約は、カラム(またはカラムの組み合わせ)で2つの行が同じ値を持たないことを保証します。コンバーターはフィールド名とサンプルデータを分析してユニーク候補を検出します。

JSON例

[
  { "id": 1, "username": "alice", "email": "alice@example.com", "name": "Alice" },
  { "id": 2, "username": "bob", "email": "bob@example.com", "name": "Bob" },
  { "id": 3, "username": "carol", "email": "carol@example.com", "name": "Carol" }
]

生成されるSQL

CREATE TABLE users (
  id SERIAL PRIMARY KEY,
  username VARCHAR(255) NOT NULL,
  email VARCHAR(255) NOT NULL,
  name VARCHAR(255) NOT NULL,
  CONSTRAINT uq_users_username UNIQUE (username),
  CONSTRAINT uq_users_email UNIQUE (email)
);

検出ロジック

コンバーターは以下の方法でユニークカラムを識別します:

  1. 名前ベースの検出emailusernameslugskucodessnphoneという名前のフィールドは一般的なユニーク候補です。
  2. サンプルデータ分析 — 複数のレコードが提供された場合、すべての値が異なるかチェックします。
  3. 複合ヒューリスティック — 既知のユニーク名を持ち、かつ個別のサンプル値を持つカラムにUNIQUE制約が付けられます。

UNIQUE vs PRIMARY KEY

特徴 PRIMARY KEY UNIQUE
NULL値 許可されない 許可される(ほとんどのDBで1つのNULL)
テーブルごと 1つのみ 複数可
インデックスの自動作成 はい はい
目的 行の識別 ビジネスルールの強制

複合ユニーク制約

ユニーク性がカラムの組み合わせに適用される場合もあります:

[
  { "user_id": 1, "role": "admin", "org_id": 10 },
  { "user_id": 1, "role": "viewer", "org_id": 10 },
  { "user_id": 1, "role": "admin", "org_id": 20 }
]
CONSTRAINT uq_user_org_role UNIQUE (user_id, role, org_id)

これにより、ユーザーが同じ組織で同じロールを2回持つことができなくなります。

部分ユニーク制約(PostgreSQL)

PostgreSQLは条件付きのユニーク性をサポートします:

CREATE UNIQUE INDEX uq_users_active_email
  ON users (email)
  WHERE is_active = TRUE;

これにより、そのメールアドレスを持つアクティブな行が1つだけであれば、重複したメールアドレスを許可します。論理削除パターンに有用です。

命名規則

uq_{テーブル}_{カラム}パターンを使用してください。複合制約の場合、カラム名をアンダースコアで結合します:uq_user_roles_user_id_org_id

ユースケース

メールアドレスとユーザー名の両方が一意である必要があるユーザー登録システムを設計し、アプリケーションコードだけに頼るのではなく、データベースレベルでこれらのビジネスルールを強制する必要がある場合に使用します。

試してみる — JSON to SQL Schema

フルツールを開く