# データベース設計書

## 概要

本ドキュメントは、dplyrパッケージに組み込まれているサンプルデータセットの構造を定義したデータベース設計書です。dplyrはRの「データ操作の文法」を提供するパッケージであり、データフレーム様オブジェクトの操作を統一的なインターフェースで実行できます。本設計書に記載するデータセットはパッケージに同梱されており、学習目的やデモンストレーション用途で使用されます。

## テーブル一覧

| テーブル名 | 対応エンティティ | 説明 |
| --- | --- | --- |
| starwars | スターウォーズキャラクター | スターウォーズ映画シリーズに登場するキャラクター情報（87件） |
| storms | ハリケーン追跡データ | NOAA大西洋ハリケーンベストトラックデータ（1975-2024年、約20,778件） |
| band_members | バンドメンバー | The BeatlesとThe Rolling Stonesのメンバー情報（3件） |
| band_instruments | 楽器情報 | バンドメンバーが演奏する楽器情報（3件） |
| band_instruments2 | 楽器情報（別名キー） | band_instrumentsと同一データ、キー列名が異なる（3件） |

## 各テーブル定義

### 1. starwars

スターウォーズ映画シリーズに登場するキャラクター情報を格納するテーブル。データソースはSWAPI（Star Wars API）であり、性別・性に関する情報は追加研究に基づいて修正されています。

| カラム名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| name | character | NO | キャラクター名 |
| height | integer | YES | 身長（cm） |
| mass | double | YES | 体重（kg） |
| hair_color | character | YES | 髪の色 |
| skin_color | character | NO | 肌の色 |
| eye_color | character | NO | 目の色 |
| birth_year | double | YES | 生年（BBY = ヤヴィンの戦い前の年） |
| sex | character | YES | 生物学的性別（male, female, hermaphroditic, none） |
| gender | character | YES | ジェンダー・アイデンティティ（masculine, feminine） |
| homeworld | character | YES | 出身惑星名 |
| species | character | YES | 種族名 |
| films | list | NO | 出演映画のリスト |
| vehicles | list | NO | 操縦した乗り物のリスト |
| starships | list | NO | 操縦した宇宙船のリスト |

### 2. storms

NOAA大西洋ハリケーンデータベースのベストトラックデータ。1975年から2024年のハリケーンの位置と属性を記録しています。1979年以降のデータは嵐の存続期間中6時間ごとに測定されています。

| カラム名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| name | character | NO | 嵐の名前 |
| year | integer | NO | 観測年 |
| month | integer | NO | 観測月 |
| day | integer | NO | 観測日 |
| hour | double | NO | 観測時刻（UTC） |
| lat | double | NO | 嵐の中心の緯度 |
| long | double | NO | 嵐の中心の経度 |
| status | factor | NO | 嵐の分類（hurricane, tropical storm, tropical depression等） |
| category | integer | YES | サフィア・シンプソンハリケーンカテゴリ（1-5、ハリケーン以外はNA） |
| wind | integer | NO | 最大持続風速（ノット） |
| pressure | integer | NO | 嵐の中心の気圧（ミリバール） |
| tropicalstorm_force_diameter | integer | YES | 熱帯低気圧強度風域の直径（海里、2004年以降のみ） |
| hurricane_force_diameter | integer | YES | ハリケーン強度風域の直径（海里、2004年以降のみ） |

### 3. band_members

The BeatlesとThe Rolling Stonesのメンバー情報を格納するテーブル。JOIN操作のデモンストレーション用のトイデータセットです。

| カラム名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| name | character | NO | メンバー名 |
| band | character | NO | 所属バンド名（Beatles, Stones） |

### 4. band_instruments

バンドメンバーが演奏する楽器情報を格納するテーブル。band_membersテーブルとのJOIN操作を示すためのトイデータセットです。

| カラム名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| name | character | NO | メンバー名（band_members.nameと結合可能） |
| plays | character | NO | 演奏する楽器名（guitar, bass等） |

### 5. band_instruments2

band_instrumentsと同一のデータを持つテーブル。キー列の名前が異なることで、異なるキー名を持つテーブル間のJOIN操作をデモンストレーションします。

| カラム名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| artist | character | NO | アーティスト名（band_members.nameと異なる列名） |
| plays | character | NO | 演奏する楽器名（guitar, bass等） |

## 備考

### データセットの用途

1. **starwars**: 複雑なデータ構造（ネストされたリスト列を含む）の操作、フィルタリング、グループ化、集計操作のデモンストレーションに使用されます。

2. **storms**: 時系列データの分析、地理情報データの可視化、ウィンドウ関数のデモンストレーションに使用されます。

3. **band_members / band_instruments / band_instruments2**: 各種JOIN操作（inner_join, left_join, right_join, full_join, semi_join, anti_join）のデモンストレーションに使用されます。

### データ形式

すべてのデータセットはtibble形式（tidyverseの拡張データフレーム）で提供されます。tibbleはデータフレームの改良版であり、以下の特徴があります：

- コンソール出力時に適切にフォーマットされる
- 行名を使用しない
- 部分マッチングを許可しない（より厳格な参照）
- リスト列をサポート

### 外部キー関係

band_membersテーブルとband_instrumentsテーブルは `name` 列で論理的に関連付けられています。ただし、完全に一致するわけではなく、以下のような状況を示すために設計されています：

- Mick（band_membersに存在するがband_instrumentsに存在しない）
- Keith（band_instrumentsに存在するがband_membersに存在しない）
- John, Paul（両方のテーブルに存在する）

### データソース

- **starwars**: SWAPI (Star Wars API) - https://swapi.py4e.com/
- **storms**: NOAA Atlantic Hurricane Database - https://www.nhc.noaa.gov/data/#hurdat
- **band_members / band_instruments**: パッケージ開発者が作成した架空のデモデータ
