# ER図

## 概要

本ドキュメントはdplyrパッケージに含まれるサンプルデータセットのエンティティリレーションシップ図です。

## 全体ER図

```mermaid
erDiagram
    starwars {
        character name PK "キャラクター名"
        integer height "身長（cm）"
        double mass "体重（kg）"
        character hair_color "髪の色"
        character skin_color "肌の色"
        character eye_color "目の色"
        double birth_year "生年（BBY）"
        character sex "生物学的性別"
        character gender "ジェンダー"
        character homeworld "出身惑星"
        character species "種族"
        list films "出演映画リスト"
        list vehicles "乗り物リスト"
        list starships "宇宙船リスト"
    }

    storms {
        character name "嵐の名前"
        integer year "観測年"
        integer month "観測月"
        integer day "観測日"
        double hour "観測時刻（UTC）"
        double lat "緯度"
        double long "経度"
        factor status "嵐の分類"
        integer category "ハリケーンカテゴリ"
        integer wind "最大風速（ノット）"
        integer pressure "気圧（mb）"
        integer tropicalstorm_force_diameter "熱帯低気圧風域直径"
        integer hurricane_force_diameter "ハリケーン風域直径"
    }

    band_members {
        character name PK "メンバー名"
        character band "所属バンド"
    }

    band_instruments {
        character name PK "メンバー名"
        character plays "演奏楽器"
    }

    band_instruments2 {
        character artist PK "アーティスト名"
        character plays "演奏楽器"
    }

    band_members ||--o| band_instruments : "name = name"
    band_members ||--o| band_instruments2 : "name = artist"
```

## バンド関連テーブルの詳細ER図

```mermaid
erDiagram
    band_members {
        character name PK "メンバー名"
        character band "所属バンド"
    }

    band_instruments {
        character name PK "メンバー名"
        character plays "演奏楽器"
    }

    band_instruments2 {
        character artist PK "アーティスト名"
        character plays "演奏楽器"
    }

    band_members ||--o| band_instruments : "JOIN操作デモ用（name列で結合）"
    band_members ||--o| band_instruments2 : "異なるキー名でのJOINデモ用（name = artist）"
    band_instruments ||--|| band_instruments2 : "同一データ（キー列名のみ異なる）"
```

## 備考

### テーブル間の関係性

1. **starwars テーブル**: 独立したエンティティであり、他のテーブルとの関連はありません。ただし、内部に `films`、`vehicles`、`starships` というリスト列を持ち、正規化されていないデータ構造となっています。

2. **storms テーブル**: 独立したエンティティであり、時系列の観測データを格納しています。`(name, year, month, day, hour)` の組み合わせで各レコードを一意に識別できます。

3. **band_members / band_instruments / band_instruments2**: JOIN操作のデモンストレーション用に設計されたトイデータセットです。以下のJOINパターンを示すことができます：
   - `inner_join`: 両方のテーブルに存在するレコードのみ取得（John, Paul）
   - `left_join`: 左テーブルの全レコードを保持（Mick含む）
   - `right_join`: 右テーブルの全レコードを保持（Keith含む）
   - `full_join`: 両テーブルの全レコードを取得
   - `semi_join`: 右テーブルに一致がある左テーブルのレコード
   - `anti_join`: 右テーブルに一致がない左テーブルのレコード

### カーディナリティの説明

- `||--o|` : 1対0または1の関係（すべてのメンバーが楽器情報を持つわけではない）
- `||--||` : 1対1の関係（band_instrumentsとband_instruments2は同一データ）

### データ構造の特徴

dplyrのサンプルデータセットは、従来のリレーショナルデータベースとは異なり、tibble（拡張データフレーム）形式で提供されます。主な違い：

- **リスト列のサポート**: starwarsテーブルの `films`、`vehicles`、`starships` 列はリスト形式で複数の値を格納
- **外部キー制約なし**: 参照整合性はデータベースレベルでは強制されない
- **インデックスなし**: 検索最適化のためのインデックスは存在しない
