マスタを作る

 こういうのってデータ構造を決めてしまえば、どういうプログラムにするかはおのずと決まってくるもの。なのでまずはデータの持ち方を考えることに。
 最初はテキストファイルとか考えていたけど、そもそもSQLの勉強も兼ねたかったので順当にDBにしました。それもMySQLにしよっかな、と安易に考えたものの、いろいろ調べていったらSQLiteの存在を知り、用途的規模的に十分使いものになりそうということでこれに決定。

 サーチシステム自体の設定値を格納する基本マスタテーブルもだけど、まずは十二国記関連の基本情報を格納したマスタが要りますね。国マスタとか、キャラマスタとか、そういうの。たとえば一番簡単と思われるマスタはこんな感じ。

※対象を特化したスクリプトなので、汎用的に全部同じテーブルに突っ込むというのはなし。そっちのほうが簡単にメニュー項目を増減できるけどね。

テーブル名称:国マスタ
テーブル名:M_COUNTRY
PRIMARY KEY 名称 データ型 NOT NULL 内容
ID INTEGER
SORT_KEY INTEGER 表示制御用
NAME TEXT 名称
LONG_NAME TEXT 長い名称
 DATEとかVARCHARとかも一応指定できるけど、SQLiteのデータ型は実際には限られた数個しかないため、ここで使うのはINTEGERとTEXTにします。SQLiteの場合は桁数を指定しなくても大丈夫だし、何よりレコードは可変長とのことなので省略。他のDBとの兼ね合いでデータ型をそろえたり桁数を指定して「VARCHAR(10)」みたいに書いたほうがいいかもしれないけど、どっちにしても試行錯誤中だし。
 国マスタの場合、いったん作成したら作り直す必要はない&ユーザではなく管理者が設定するので、UNIQUE制約とかはなし。数が限られている上に普通にデータを入れればどうしたってユニークになるし、こんな小さなテーブルで余分なINDEXを作ることもないし(ユニークにすると自動的にINDEXが作成される)。NOT NULL制約の場合は、自分でカラムの性質の意図を忘れるのを防止できるのであったほうがいいけど
 IDは、国マスタの場合は1からの連番。裏で持っていて検索時に使うとか、他のテーブルに外部キーのようなものとして格納するので、人間にわかりやすくする必要なし。
 SORT_KEYは画面表示用のオプション。検索時、ORDER BY句で使うのを想定。必要がなければNULLにしておく。IDと違って厳密じゃなくていいので重複可。項目を作っておけば表示順を変えるときにSQL(ソースコード)に手を入れる必要はないし、値に何を入れても、クエリの結果順にしか影響を及ぼさないのがミソ。
 NAMEは通常の表示名。慶国なら「慶」、雁国なら「雁」。
 LONG_NAMEはフルネーム。慶国なら「慶東国」、雁国なら「雁州国」。

 ちなみにINTEGER型のカラムを(単独で?)プライマリキーにすると、SQLiteでは自動的にオートナンバー型になるそうです。とはいえ一般データならそれでもいいんでしょうが、マスタだと再構築の際に何かと問題ありなので、INSERTの際に明示的に指定することにします。

 なおDBの文字コードはデフォルトのUTF-8とします。CGIでも何かと面倒がないし。
 あと、テーブル名やカラム名に日本語も使えるらしいし、ローカルで試したらうまくいったけど、トラブったらイヤなので普通に英数字で。日本語だとSQLの斜め読みできそうで便利は便利なんですけどね。日本語を使うと名称がどうしても長くなりがちというのもあります。

追記

 DBの初期化機能作成後、文字列だった日付データをユリウス日(浮動小数)で持つよう変更しました。DBの型もTEXTからREALに変更。
 文字列で持とうとしたのは、まぁ、SQLiteに型がない&深く考えてなかったのと、レコードを目で見たときにわかりやすいほうが楽だったから。というか最初はあまりまともな物を作れるとは思わなかったし……そもそも早い段階で飽きて放置するかと(^^;
 でもまあ、それでもいろいろ作っていたら、WHERE句での指定でユリウス日のほうが面倒がないとか、多分REALのほうが速いんじゃないだろうかってのがあって。何より文字列だと「これってUTCだっけ? localtime?」等々紛らわしいけど、ユリウス日なら区別する必要なし。で、表示時だけ任意の形式&ローカル日付でフォーマットする、と。

2010/10/14 18:29:21更新
最終更新:2010年10月14日 18:29