Firebase Data ConnectのDirective

# Firebase DataConnectディレクティブまとめ

Firebase DataConnectで使用される主要なディレクティブの概要と使用方法をまとめています。

# Firebase DataConnectディレクティブまとめ

Firebase DataConnectで使用される主要なディレクティブの概要と使用方法をまとめています。

## ディレクティブ概要テーブル

| ディレクティブ | 目的 | 主な使用方法 |
|----------------|------|--------------|
| @auth | 認証ポリシーの定義 | アクセスレベルや条件式を指定 |
| @col | テーブル列のカスタマイズ | 列名、データ型、サイズなどを指定 |
| @default | デフォルト値の指定 | 定数値、式、SQLを使用 |
| @index | インデックスの定義 | 単一/複合フィールドにインデックスを作成 |
| @ref | 外部キー参照の定義 | リレーションシップと参照先を指定 |
| @table | テーブルの定義 | テーブル名、主キー、名前形式を指定 |
| @transaction | トランザクション実行の要求 | ミューテーションに適用 |
| @unique | 一意制約の定義 | 単一/複数列に一意制約を設定 |
| @view | SQLビューの定義 | SELECT文を指定してビューを作成 |


## 1. @auth

**目的**: クエリやミューテーションの認証ポリシーを定義する

**使用方法**: アクセスレベルや条件式を指定して、操作の実行権限を制御する

**注意点**: 適切な認証レベルの設定が重要で、セキュリティに直結する

## 2. @col

**目的**: SQLデータベーステーブルの列を表すフィールドをカスタマイズする

**使用方法**: 列名、データ型、サイズなどを指定して、フィールドと列のマッピングをカスタマイズする

**注意点**: Vector型には必ずsizeパラメータを指定する必要がある

## 3. @default

**目的**: 列フィールドのデフォルト値を指定する

**使用方法**: 定数値、式、SQLなどを使ってデフォルト値を設定する

**注意点**: フィールドの型に応じて適切なデフォルト値を設定する

## 4. @index

**目的**: データベースインデックスを定義してクエリのパフォーマンスを最適化する

**使用方法**: 単一フィールドまたは複合フィールドにインデックスを作成し、順序や種類を指定する

**注意点**: 過剰なインデックス作成は書き込みパフォーマンスに影響を与える可能性がある

## 5. @ref

**目的**: 他のテーブルへの外部キー参照を定義する

**使用方法**: リレーションシップを定義し、参照先のテーブルと列を指定する

**注意点**: カスケード削除や任意の関連付けなど、適切な参照オプションを選択する

## 6. @table

**目的**: リレーショナルデータベーステーブルを定義する

**使用方法**: テーブル名、主キー、単数形・複数形の名前などを指定してテーブルを定義する

**注意点**: 適切な主キーの選択が重要で、通常はidフィールドが自動的に追加される

## 7. @transaction

**目的**: ミューテーションがDBトランザクション内で実行されることを要求する

**使用方法**: ミューテーションに適用し、全ての操作が成功するか全て失敗するかを保証する

**注意点**: 現在のところ、クエリには適用できない

## 8. @unique

**目的**: @tableに一意制約を定義する

**使用方法**: 単一列または複数列に対して一意制約を設定し、重複を防ぐ

**注意点**: @refフィールドに適用すると、一対一の関係を定義できる

## 9. @view

**目的**: リレーショナルデータベースのRaw SQLビューを定義する

**使用方法**: SQLのSELECT文を指定して、ビューを作成し、GraphQLフィールドとマッピングする

**注意点**: ビューは読み取り専用で、直接変更することはできない

---

# Firebase DataConnectディレクティブまとめ

Firebase DataConnectで使用される主要なディレクティブの概要と使用方法をまとめています。


## 使用例

### 1. @auth

```graphql
# ユーザーレベルの認証が必要なクエリ
query GetUserProfile @auth(level: USER) {
  user(id: "123") {
    name
    email
  }
}

# カスタム条件式を使用した認証
query GetAdminData @auth(expr: "auth.token.admin == true") {
  adminReports {
    id
    content
  }
}
```

### 2. @col

```graphql
type User @table {
  id: ID! @col(name: "user_id")
  name: String @col(name: "full_name", dataType: "varchar(100)")
  age: Int @col(dataType: "smallint")
  profile: Vector @col(size: 768)  # Vector型にはsizeが必須
}
```

### 3. @default

```graphql
type Post @table {
  id: ID! @default(expr: "uuidV4()")
  title: String
  content: String
  createdAt: Timestamp! @default(expr: "request.time")
  status: String! @default(value: "draft")
}
```

### 4. @index

```graphql
type Product @table {
  id: ID!
  name: String @index  # 単一フィールドのインデックス
  price: Float
  category: String
}

type Order @table @index(fields: ["userId", "createdAt"]) {  # 複合インデックス
  id: ID!
  userId: ID!
  createdAt: Timestamp!
  total: Float
}
```

### 5. @ref

```graphql
type Comment @table {
  id: ID!
  content: String
  post: Post! @ref  # Post テーブルへの参照
  author: User! @ref  # User テーブルへの参照
}
```

### 6. @table

```graphql
type Book @table(name: "books", singular: "book", plural: "books") {
  id: ID!
  title: String!
  author: String
  publishedYear: Int
}
```

### 7. @transaction

```graphql
mutation TransferFunds @transaction {
  debitAccount(id: "123", amount: 100) {
    newBalance
  }
  creditAccount(id: "456", amount: 100) {
    newBalance
  }
}
```

### 8. @unique

```graphql
type User @table {
  id: ID!
  email: String! @unique  # メールアドレスに一意制約
  username: String! @unique  # ユーザー名に一意制約
}
```

### 9. @view

```graphql
type PopularPosts @view(sql: """
  SELECT p.id, p.title, COUNT(c.id) as comment_count
  FROM posts p
  LEFT JOIN comments c ON p.id = c.post_id
  GROUP BY p.id, p.title
  HAVING COUNT(c.id) > 10
  ORDER BY comment_count DESC
""") {
  id: ID!
  title: String!
  commentCount: Int!
}
```