苫小牧高専情報工学科名物(?)のグループ実験をやっている。PHPで自動車検索システムを作ります。
いろんな会社のいろんな車がExcelファイルにまとめられているので、それをどうにかしてデータベースにぶち込んで、それを検索したり在庫を増やしたり減らしたりできるWebアプリケーションをPHPで、グループで作るやつ。
実験書だとExcelVBAを使ってデータをDBに投入する感じで書いてあるけど、道具はなんでもいいらしいので、僕はRubyでサクッとやるつもりだった。だったんだけど、どうもガチガチに正規化されたテーブル設計(実験書で指定されている)と僕のActiveRecord脳は相性が悪いようで……。
企業名テーブル(トヨタやらダイハツやらの企業名と、int型の企業コードのみ格納されたテーブル)や、車名テーブル(ブーンやらプリウスやらの車名と、int型の車名コードのみ格納されたテーブル)、車種テーブル(軽自動車やらセダンやらの車種と、int型の車種コード)を用意して、その後仕様テーブルを用意する。この使用テーブルには、企業名・車名・車種のコードと、あとはそれぞれの仕様(定員とかグレードとか。30カラムくらいあった気がする)を格納した仕様テーブルを用意し、最後に仕様ごとに在庫数を管理する在庫テーブルを用意して……という感じ。うーん、DBの正規化理論(?)的にはこれが正しいんだろうか。O/Rマッパーに頼って生きてきた僕にとってはなんでこんなにテーブル増やすのか意味不明という感じであった。DBの授業でやったから理解はできるけど、とにかくめんどくさい……。
とりあえず、ExcelファイルをCSVファイルにエクスポートして、Rubyのハッシュオブジェクトに変換し、それをSequelを使ってDBにぶち込む感じでやった。
初期データの投入ができたので、次回からはPHPを書いていく感じかなー。学校の実験はRailsから外れてプログラミングをする良い練習になる。がんばろう。
追記
izuminさんからこんなリプライが来て、いろいろやり取りした結果学びがあったので共有します。詳細はツイートを辿って欲しい。
@mktakuya たとえば「車種名の重複が100%起き得ない」ならなんちゃらコードいらないかもだけど,それを断言できないならあっていいんじゃない?という気もするよ
— いずみん (@izumin5210) 2016年5月1日
数字で構成されたコードって表記ゆれ起きないじゃん?みたいな文脈でもなんか意味あるのかな?(銀行コード的な)
@mktakuya 違う車名でも車種が同じとかあるじゃん?
— いずみん (@izumin5210) 2016年5月1日
車名には日本語名英語名仏語名etc.があったら? て考えてみるとわりと自然な気もする
ぼくも生SQLほぼ書かないORM脳だしOOP脳だけどテーブル見たら自動で脳内正規化走るしあまり関係ないのでは??
@mktakuya なるほど〜 やっぱブランド名的なアレが入るのか 気づいてよかった
— いずみん (@izumin5210) 2016年5月1日
あと,でかいモデル(車とかUserとか)にカラムいっぱいもたせる方式だと,サービスでかくなった時にカラムの追加変更処理等がクソ重くなってつらい気持ちになるというデメリットもあるかもしれない
@izumin5210 「日本サイトではフィットと表示、英語圏向けサイトではFITと表示」という機能を実現する時、車モデルに車名を直接入れるよりも、車名テーブルに日本語・英語名を格納して、他のテーブルからは車名コードを参照するようにすれば、変更や検索に強い設計になる気がします。。
— mktakuya (@mktakuya) 2016年5月1日
「車テーブル作ってそこに全部ぶち込めばいいじゃん、って思ってたけど、そうでもなさそう。」という事がわかった。
例えば、フランス語表記の車名も追加したいってなったとき、車テーブルにすべてをぶち込んでしまっていると、車の台数分の更新処理(フランス語車名カラムを追加する)が走るけど、車名テーブルに切り出してあれば、そこにフランス語車名カラムを追加するだけでDB側の変更はOKということになる。たぶんそんな感じ。
DB設計の知識も蓄えていかなければなぁ……。