データベースのお勉強
艦種:戦艦 駆逐艦
装備: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