データベースのお勉強

艦種:戦艦 駆逐艦
装備:35砲 四連酸素魚雷 ダメコン
戦艦は35砲とダメコンを装備できる
駆逐艦は四連酸素魚雷とダメコンを装備できる

これをデータベースに保存することを考える。
艦種よりは装備の方が数が増えやすいので、装備に装備可能艦種を持つことにする。
以下のようにテーブルを定義する。

テーブル名:装備
{名前、戦艦装備可、駆逐艦装備可}

テーブル名:艦種
{名前}

実際のテーブルは以下となる。

テーブル名:装備
{35砲、可、不可}
{四連酸素魚雷、不可、可}
{ダメコン、可、可}

テーブル名:艦種
{戦艦}
駆逐艦

装備可能かの判定は艦種を取得して、ロジックなりストアドなりCASE文なりでごりごり。

ってのがありがちな感じな気がするけど、「艦種が増える」と言う一つのことで二か所をいじるのはあまり美しくない。
とは言え、艦種に装備可能情報持たせたら余計に地獄なので、もうどうしようもないのでは。
いや、なんかあるでしょ。

テーブル名:艦種
{名前}

テーブル名:装備
{名前}

テーブル名:装備可
{艦種、装備}

実際のテーブルはこんな感じ。

テーブル名:艦種
{戦艦}
駆逐艦

テーブル名:装備
{35砲}
{四連酸素魚雷
{ダメコン

テーブル名:装備可
{戦艦、35砲}
{戦艦、ダメコン
駆逐艦、四連酸素魚雷
駆逐艦、ダメコン

判定はスマートな方法がちょっと調べてよく分からないけど、こんなんで良いのかな。

SELECT COUNT(*) FROM 装備可 WHERE 艦種 = '戦艦' AND 装備 = '35砲'

欲を言えば見つかったらすぐ帰ってほしいんだけど、どうやれば良いんだろう。

装備可能なリストを持ってくるのは、簡単なSQLの結果をそのまま並べれば良いので楽。

SELECT 装備 FROM 装備可 WHERE 艦種 = '戦艦'

でも、ソートをしようと思うと結合で頑張れってなるので、なんか結局手間そんなに変わらない気がして来たな!

テーブル名:艦種
{名前、ID}

テーブル名:装備
{名前、ID}

SELECT 装備可.装備 FROM 装備可 WHERE 艦種 = '戦艦' INNER JOIN 装備 ON 装備可.装備 = 装備.名前 ORDER BY 装備.ID

こうなって来ると、装備可テーブルはIDで持った方が良い気がしてきますよね。

定義
テーブル名:艦種
{ID、名前}

テーブル名:装備
{ID、名前}

テーブル名:装備可
{艦種ID、装備ID}

実際
テーブル名:艦種
{1、戦艦}
{2、駆逐艦

テーブル名:装備
{1、35砲}
{2、四連酸素魚雷
{3、ダメコン

テーブル名:装備可
{1、1}
{1、3}
{2、2}
{2、3}

SELECT COUNT(*) FROM 装備可 WHERE 艦種ID = 1 AND 装備 = 1
SELECT 装備.名前 FROM 装備可 WHERE 艦種ID = 1 INNER JOIN 装備 ON 装備可.装備ID = 装備.ID ORDER BY 装備.ID


SQLが怖いのは、ブラックボックスの中身覗かないと速度差がヤバいって辺りですよね。