DBIx::Skinny::ProxyTable

すっかりブログに書きわすれていたんですが、こんなの作りました

http://github.com/walf443/p5-dbix-skinny-proxy_table

基本的にDBIx::Class::ProxyTableの使い勝手を踏まえつつ、
微妙にこうだったらよかったねーという部分を機能追加した感じになっています。

  package Proj::DB;
  use DBIx::Skinny;
  use DBIx::Skinny::Mixin modules => [qw(ProxyTable)];

  package Proj::DB::Schema;
  use DBIx::Skinny::Schema;
  use DBIx::Skinny::Schema::ProxyTableRule;

  install_table 'access_log' => shcema {
    proxy_table_rule 'strftime', 'access_log_%Y%m';

    pk 'id';
    columns qw/id/;
  };

  package main;

  Proj::DB->proxy_table->set(access_log => "access_log_200901");
  Proj::DB->proxy_table->copy_table(access_log => "access_log_200901");
  my $rule = Proj::DB->proxy_table->rule('access_log', DateTime->today);
  $rule->table_name; #=> "access_log_200901"
  $rule->copy_table;

  my $iter = Proj::DB->search($rule->table_name, { foo => 'bar' });

http://perl-users.jp/articles/advent-calendar/2009/dbix-skinny/18.html

の話のDBIx::Skinny::Mixin::ProxyTableをベースにして微妙に機能追加をしています。

改良したのは、Ruleを定義しておいて、それをSchemaに書けるようにすることで、名前づけのルールが分散したりしないようにしたことと、
うっかり.を含む名前を自動生成しちゃってSQLがこけたりするというのがあったりしたので、テーブル名に使える文字を制限して、
[A-Za-z0-9_]にしてチェックを入れるようにしたりしました。

テーブルを動的に作るのは増やしすぎると後で扱いがめんどくさくなったりファイルシステムとストレージエンジンによってはパフォーマンスが落ちたりするので、
可能であるならDB分割をする方が望ましいんじゃないかなと思いますが、お手軽に導入はできますし、
似たようなSchemaでテーブル名だけが違うような仕組みでそこまでテーブル数が増えなさそうなもの(カテゴリ別ランキングでカテゴリごとにテーブル分けたりとか)
などに使うとそこそこ便利なんじゃないかと思います。