IIDX全曲表の作り方2 DB設計と更新方法について


さて、1回目が面白かったかどうかはさておきとして、ちょっとは見てくれた方もいたようなので続きを書いていきます。

その1はこちら。

続きは↓から。

まずはDBについて。

テーブルは以下のような感じになってます。

ac**
cs**
music
detail
m_all

それぞれのテーブルの中身は以下のような感じです。

[ac/cs(各バージョン別の曲表管理)]

no(曲ID)
msc(曲名)
spn(SP NORMAL難度)
sph(SP HYPER難度)
spa(SP ANOTHER難度)
(spd)(SP DARK ANOTHER難度)
dpn(DP NORMAL難度)
dph(DP HYPER難度)
dpa(DP ANOTHER難度)
(dpd)(DP DARK ANOTHER難度)
n7(SP NORMAL NOTES)
h7(SP HYPER NOTES)
a7(SP ANOTHER NOTES)
(d7)(SP DARK ANOTHER NOTES)
n14(DP NORMAL NOTES)
h14(DP HYPER NOTES)
a14(DP ANOTHER NOTES)
(d14)(DP DARK ANOTHER NOTES)
score(n:新曲, o:旧曲, r:復活曲)
change(譜面変更とかがあれば、DAとか書く(この場合はDoubleのAnotherが変更))

[music(全体のアーティスト名ジャンル名他の管理)]

no(曲ID)
msc(曲名)
ver(収録バージョン, 半角スペース区切り)
bpm(通常bpm)
bpmn(最小bpm)
bpmx(最大bpm)
genre(表記上のジャンル名)
artist(表記上のアーティスト名義)
japan(日本語ソート用の数値)

[detail(詳細データ)]

no(曲ID)
bpmd(bpm変化詳細)
dspn(難度変更SPN)
dsph(難度変更SPH)
dspa(難度変更SPA)
ddpn(難度変更DPN)
ddph(難度変更DPH)
ddpa(難度変更DPA)

[m_all(全部JOINするより全曲入った表があった方がいいんじゃない?と思って作った表)]

ac/csと同じ。(ただし全てのデータを含む)

こいつらをNATURAL JOINして使っています。

新曲だけを抽出したいときは、scoreがnになってるのを拾ってくればいいわけなので、例えばResortAnthemの新曲なら

SELECT * FROM ac18 NATURAL JOIN music WHERE score = ‘n’;

ってな感じで取ってきてます。旧曲も含めたらWHERE句以降を捨てればそのバージョンの全曲になります。復活曲ならscore=’r’、と。簡単ですね。

さて、既にここで重大な問題があります。

musicとac/csの各バージョンのテーブルをよく見てください。noとmscが両方に含まれています。NATURAL JOINしているわけですから、noとmscが両方一致しないといけないわけですが、曲名はまれに修正が入ります。手作業でやってると、間違って片方しか更新しないとかっていうのは十分にありえます。十分にありえます。

データはこれらをExcelで管理してます。

こんな感じ。

修正の手順はこんな感じ

  1. Excelでデータ修正
  2. tab区切りテキストで書き出し
  3. データはEUC-JPなので書き出したテキストをEUC-JPに変換
  4. 普通に書きだすとSpookyのbpm変化が激しすぎて(Excelのテキスト形式の制限文字数をオーバーしてる?)バグってしまわれるので、公開している全曲表からコピペ
  5. Excelから書きだすと20,Novemberなどカンマがある曲は二重引用符が勝手に付くのでこれを除去

で、ようやくデータをインポートします。(Spookyの件とかどうすればいいの・・・)

・・・まあよく考えればこの一連の流れは毎度同じなので、バッチ処理なりなんなりすれば良かったんですが、「今回はいいか」と全てスルーしてました。

さらに、

さらにですよ、

それに加えて面倒だから、とExcelの方をいじらずにPHPPgAdminから直でいじったりしやがったりするものですから(大概この更新はExcelに反映するのを忘れる)データがあっち行ったりこっち行ったりで・・・もうねアホかと。

そりゃ、先祖返りもするよねヽ(´ー`)ノ

面倒なことになる前に少々の面倒は買って出るべきなのですよ。

マズイところ:

  • データが2重に管理されている
  • 正規化されていないDBのテーブル
  • detailやm_allなどが管理されていない(全然データ更新してないです)

改善:

  • データは一元管理し、バックアップを取る
  • DBのテーブル構造を見直す

データが更新されてないのは、上の2つをちゃんとしておけば治るでしょう。あとはやる気だけです。治ればやる気も少し出るかな。少し。

データをどこで一元管理するか、というのが難しいところですが、Excelで正規化したデータを管理すると見た目よく分からない気がするので、サーバ側のデータを最新として、cronとかでバックアップできるようにすればいいんですかね。あとは更新しやすさの問題があるけど、ここはうまいこと管理ツールが作れれば良さそう。

報告があったら、ボタン一つで採用!ってのができればステキなんですけどね。報告機能は前のは携帯版しかないのでパワーアップしたいところ。


コメントを残す

メールアドレスが公開されることはありません。