ER図を『ドラゴンクエスト』のモンスターのデータから読み解く記事
はじめに
今回の記事では、設計や開発で必要不可欠であるものの、とっつきづらい「ER図」を、『ドラゴンクエスト』に登場するモンスターを具体例に説明する。言い換えれば、『ドラゴンクエスト』のモンスターのデータを出力する際に必要なデータベース設計を考える。
対象とする読者
- プログラミング初心者
- ER図についてまったくわからないひと
- 記事のタイトルに興味を持ったひと
ER図とは
ER図はEntity Relationship Diagramの略称である。データベースのテーブルであるエンティティと、テーブル同士の関連を示すRelationshipを図で表現したもので、主としてデータベースのテーブル設計の際に用いられている。
ER図はそのシステムが扱うデータ構造や関係性を把握する上で必要不可欠である。
ER図のつくりかた
(1) 最終的に出したいイメージを作る
まずは、初心者向けに最終的なゴールのイメージを持ってもらうために出力したいデータを考える。
今回の記事で取り扱うデータは、『ドラゴンクエストXI 過ぎ去りし時を求めて』に登場するモンスター図鑑にある、モンスターのデータである。この画面から出力したいデータを箇条書きで取り出す。
(2) 必要なデータを列挙する
次に、必要なデータを箇条書きで列挙する。上述の画像を見ると、必要なデータは以下のようになる。
- モンスター名
- 系統
- 経験値
- ゴールド
- 生息地
- 獲得アイテム(通常ドロップ、レアドロップ)
- まめちしき(モンスターの説明)
(3) 時系列で並べる
次に、必要なデータを簡潔に時系列で並べる。
上述の図は、『ドラゴンクエスト』における、「モンスターに遭遇して、そのモンスターを倒してアイテムを落としたとき」の流れを表現したフローチャートである。
Habitat
はモンスターの生息地で、言い換えればモンスターが出現する場所を意味する。例えば、『ドラゴンクエストXI 過ぎ去りし時を求めて』に登場する地名を列挙すると、「デルカダール地方」や「ダーハラ湿原」などが挙げられる。
Monster
はモンスターそのものを示す。系統、1匹倒すことで得られる経験値やゴールドがある。
ItemDrop
はモンスターを倒した際に手に入るアイテムを意味する。
(4) データのグループごとに分類する
(2)と(3)で取り上げたデータをグループごとに分割する。このデータのグループのことをエンティティと呼ぶ。
(5) エンティティ同士の関連性を線でつなぐ
それぞれのエンティティを明らかにしたら、関連するエンティティ同士を線で繋ごう。
(6) 図に落とし込む
(5)をもとに、実際にER図に落とし込んでいく。
上述のER図における、それぞれのエンティティや属性について詳細に解説する。
Monster
エンティティ
文字の通り、モンスターに関するエンティティ。それぞれのモンスターは、以下の属性を持つ。
-
monster_id
:モンスターそれぞれに割り当てられているID -
name
:モンスターの名前 -
family
:モンスターが所属している系統。詳細は後述 -
habitat
:モンスターの生息地。 -
exp
:倒したときに得られる経験値 -
gold
:倒したときに得られるゴールド -
has_items
:モンスターが落とすアイテム -
description
:モンスターについてのまめちしき
DropItem
エンティティ
モンスターが落とすアイテムに関するエンティティ。normal_drop
という通常のドロップアイテムと、rare_drop
というレアなドロップアイテムの2種類がある。Item
エンティティと関連している。
『ドラゴンクエスト』の世界では、モンスターを倒すとアイテムドロップが出る。だから、Monster
エンティティと1対1の関係にしている。
Item
エンティティ
文字の通り、アイテムに関するエンティティ。以下の属性を持っている。
-
item_id
:アイテムのID -
name
:アイテムの名前 -
description
:アイテムについての説明
Family
エンティティ
モンスターの系統に関するエンティティ。以下の属性を持っている。
-
family_id
:系統のID -
name
:系統の名前
例えば、『ドラゴンクエストXI』におけるモンスターの系統は「スライム系」「獣系」「ゾンビ系」など数多くある。その系統の中に、様々なモンスターが所属しているのだ。そのため、Monster
エンティティと1対多の関係で結んでいる。
「スライム系」のモンスターであれば、スライム、スライムベス、バブルスライム等と、様々なモンスターが所属している。1対多の関係にする最大のメリットは、例えばモンスターを検索しているときに「スライム系」だけのモンスターを抽出するうえで効率的に検索できるというメリットが挙げられる。
Habitat
エンティティ
モンスターの生息地に関するエンティティ。以下の属性を持つ。
-
habitat_id
:生息地のID -
name
:生息地の名前
『ドラゴンクエスト』の世界では一つの生息地に複数のモンスターが生息しているので、Monster
エンティティと1対多の関係で結ぶ。
ER図を描く上での最も重要な注意点
多種多様なエンティティを挙げながら、それらの関連性を図示してER図を描く。そこで、ER図を描く上での、最も重要な注意点がある。それは、各エンティティに必ずIDという属性をつけることだ。その理由は、それぞれのエンティティのインスタンスを一意に識別するためである。各インスタンスは他のインスタンスと区別できる一意のキー(ID)を持つことで、データベースからデータを正確に取り出したり、更新したり、削除したりできるのだ。
他にも、各エンティティにIDという属性をつける理由を4点解説する。
- 一意性:IDは各レコードを一意に識別する。これはデータ整合性を保つために重要だ。例えば、同じ名前を持つモンスターがいた場合でも、それぞれのモンスターは一意のIDによって識別できる。
- リレーションシップ: IDはテーブル間のリレーションシップを定義するためにも使われる。他のテーブルのIDを参照することで、エンティティ間の関連性を表現できる。例えば、モンスターテーブルのfamilyフィールドがFamilyテーブルのfamily_idを参照することで、そのモンスターがどの家族に属しているかを表示できる。
- パフォーマンス: 一般的に、数値のIDは文字列よりもデータベースでの処理が高速である。IDをキーとしてレコードを検索すると、特に大量のデータがある場合に高速な検索ができる。
- データの安定性: エンティティの他の属性(例えば、名前や説明)が変わる可能性がある場合でも、IDは変わらない。これにより、時間が経っても一貫性を保つことができる。
まとめ
今回の記事では、データベース設計で必要不可欠であるものの、とっつきづらいER図を『ドラゴンクエスト』に登場するモンスターのデータを題材に解説した。データベースの設計では、出力したいデータの大まかなイメージを明らかにして、そのデータ同士の関連性を正確に理解することが鍵となる。
今回の記事を通して、ER図に対する理解が深まれば幸いだ。
参考記事
引用画像について
このページで利用している株式会社スクウェア・エニックスを代表とする共同著作者が権利を所有する画像の転載・配布は禁止いたします。
© ARMOR PROJECT/BIRD STUDIO/SPIKE CHUNSOFT/SQUARE ENIX All Rights Reserved.
Discussion