Tokyo Tyrant(Tokyo Cabinet)をSQLデータベースっぽく使う場合のメモ

Tokyo Tyrant(Tokyo Cabinet)をSQLデータベースっぽく使う場合のメモ

 テーブル毎にttserverを立ち上げるといいのだけれど、ttserverは1つだけで複数テーブルを扱いたいと思った時にやること。

(書いてるうちに、複数の.tc*にアクセスできるttserverみたいなのを作ったほうがいいんじゃね? とか思ったけど。レプリケーションとか面倒そうだしなぁ……)

(Tokyo Cabinetの)テーブルデータベースを利用する

  • 拡張子が「.tct」のやつ。うっかり他で作ったらやり直し。
    • Tokyo Tyrant経由でアクセスしたときにうっかりすると気がつかないので気をつける。

put時テーブル名も一緒に登録する

  • "\x7fTABLE_NAME"等のカラムを追加してテーブル名を入れる
    • \x7fとか使っているのは、カラム名が重複しないように(他の理由は後述)
  • tcrmgr misc localhost setindex ^?TABLE_NAME lexical とかでインデックスを作る
    • misc search の指定方法が分からない……。できないのかな?

カラム名は「テーブル名.カラム名」に変換する

  • テーブル名を保存するカラム名に\x7fを付けたのは、その場合は変換しないようにしたかったから

NULLは\x7fに、空文字は\x1fに変換する

  • 問題があるかもですが、通常使わない文字を登録しておくと検索するときは便利
    • \x7f(^?)や\x1f(^_)を使ったことそのものには特に意味はないので、他のコントロールコードでもいいかもしれません
    • 場合によっては(Oracleっぽく)NULLと空文字を共通にしてもいいかもしれない

AUTO_INCREMENTの対応

  • "\7fAUTO_INCREMENT\7f<テーブル名>" というキーにaddintを発行して、auto_increment値を作成している

キーは"\7fTABLE\7f<テーブル名>\7fPKEY\7f<プライマリキー>"にしてる

  • プライマリキーを指定してデータを取得するときにsearchを使わずにgetで済ませるため

SQLを分解してaddcondやsetorder、setlimitに変換する

  • ――ということはしていない。
  • 配列(ハッシュ)として作成した検索条件をSQLに変換してクエリを発行するO/Rマッパーを使っているため、そのSQLへの変換部分をaddcond等で使う条件への変換に修正している
    • ただし、全ての条件を変換できるわけではない。また、Tokyo Cabinet Table の検索で使える条件を追加もした。
      • 例えば、比較(=)はSTREQに割り当てているため、NUMEQを使うため方法(==)も追加した。

型などの変換は自前でやる

  • 登録/変更/取得するや比較するときに変換する
    • 日付型や日時型はUNIX TIMEに変換する
    • defaultやtimestampの自動更新はできないので、登録/更新時に自動的に付加するようにする