読者です 読者をやめる 読者になる 読者になる

僕は右へ行く

適当に書くよ!

東方キャラとスペル名のデータベース化を考える

MySQLで東方のキャラクタとスペルカード一覧をデータ化して一覧にしたいなと思って考えました。
先にこんな感じ。

games

まずはどのタイトルのゲームに出てくるかを求めるために、"games"テーブルをつくります。
シンプルにメインのタイトルと英語のサブタイトルを入れます。
あ、あと発売日くらいのフィールドもここで用意しておきましょう。

  • game_id
  • title
  • subtitle
  • release_date
CREATE TABLE `games` (
  `game_id` INT AUTO_INCREMENT,
  `title` VARCHAR(20) NOT NULL,
  `subtitle` VARCHAR(40),
  `release_date` DATE,
  PRIMARY KEY (`game_id`)
)

characters

次にキャラのデータを格納する"characters"テーブル。
名前のフィールドに"familyname"と"firstname"をつくろうと思いましたが、
「鈴仙・優曇華院・イナバ」のような例で困るので、"fullname"フィールドを設けて
姓、名で明確に分かれていることが分かるキャラの名前は「全角スペースで区切る」ような運用で対処することにします。
あと、読み方と二つ名(?)がゲーム内登場時に出るので、そのフィールドも用意します。

  • character_id
  • fullname
  • kana
  • nickname
CREATE TABLE `characters` (
  `character_id` INT AUTO_INCREMENT,
  `fullname` VARCHAR(30) NOT NULL,
  `kana` VARCHAR(50),
  `nickname` VARCHAR(30),
  PRIMARY KEY (`character_id`)
)

gamecharacters

どのゲームにどのキャラクタが出てくるかという情報をもつテーブルをつくります。
ここで完全に「どの場面で」という状況を定めてしまいたいので、
"stage"フィールドを設けて、そこに出現ステージを格納するようにします。
INTEGERにするとエキストラステージに対応できませんが、「99=EX」のように数値化してしまいます。
あとでソーティングするときに役に立つとおもいます。

  • gamecharacter_id
  • game_id
  • character_id
  • stage

他に考慮すべき点として、小傘とかナズーリンみたいに複数ステージに登場する場合は、その分レコードとして登録します。
"stage"をNULLにするとエンディングだけ登場するようなキャラを登録することもできますね。

CREATE TABLE `gamecharacters` (
  `gamecharacter_id` INT AUTO_INCREMENT,
  `game_id` INT,
  `character_id` INT,
  `stage` INT,
  PRIMARY KEY (`gamecharacter_id`),
  FOREIGN KEY (`game_id`) REFERENCES `games`(`game_id`),
  FOREIGN KEY (`character_id`) REFERENCES `characters`(`character_id`)
)

spellcards

上の"gamecharacters"テーブルと関連する形でスペルカードテーブルをつくります。
どのゲームでどのキャラがどの場面で「何というスペルを使うか」というテーブルになります。
スペルカードによっては(というか大半が)難易度によって名称が変わるので、"mode"フィールドを一緒に置いて「どの難易度で」スペルを使うかを特定できるようにします。

ただしこのままだと「どの順番で」というのがわかりません。
INSERTするときにその順番通りにいれて、そのidでソート、というのも考えられましたが、
そこまで神経質に入れるのもイヤなので、"order"をつくってそこに何番目のスペルかを格納します。

また名称のパターンとして[〇符「XXXXX」]とか[〇〇「XXXXX」]というのがありますが、
カギ括弧で分けたりせずそのままの名称を入れます。
これが別々で必要になる状況はないと思いましたので。

  • spellcard_id
  • gamecharacter_id
  • mode
  • spellname
  • order
  • note

ややこしいのは、紅魔郷の対パチュリーや永夜抄の4BOSSです。
前者は自機によってスペルが変わります。ただ今回はスペル一覧を出せればいい要件なので、"note"に備考扱いで書いておくことにします。
後者は自機によってボス自体が可変です。これはgamecharactersテーブルにその分を追加することと、その旨を"note"に記して分かるようにしておきます。

CREATE TABLE `spellcards` (
  `spellcard_id` INT AUTO_INCREMENT,
  `gamecharacter_id` INT,
  `mode` VARCHAR(10),
  `spellname` VARCHAR(40),
  `order` INT,
  `note` VARCHAR(100),
  PRIMARY KEY (`spellcard_id`),
  FOREIGN KEY (`gamecharacter_id`) REFERENCES `gamecharacters`(`gamecharacter_id`)
)

データインポート

CSVで作ってインポートしようとおもっています。
次につづけ。