データベースのお勉強がてらに、ただタギングするツール書いた

Perl5.10(1005) + DBI + DBD::SQLite で動きます。


本体コード: Local/Util/TaggingDatabase.pm http://ideone.com/bU1R8
テスト: test.pl http://ideone.com/6QKsc

特徴

  • 既存のデータベースのテーブルに対してタギングできます。
  • テーブルを2つ増やすだけでタギングできます。
  • タギング対象となるデータがユニークな数値型(INTEGER)でないといけません。
  • タグテーブルにおいてはタグは重複しません、削除機能もありません。

使い方

my $DB_FILE = "./SampleDB.sqlite"; 
my $dbh = DBI->connect("DBI:SQLite:$DB_FILE",'','', {RaiseError => 1, PrintError => 0}) || die;
my $tag = new Local::Util::TaggingDatabase($dbh);

とかして、TaggingDatabaseにデータベースハンドルを渡してインスタンスを作ります。


初回処理時はテーブルの生成が必要です。

$tag->createTagTable();
$tag->createItemTagTable();


もし、既に存在するテーブル名とデフォルトなテーブル名がバッティングしてしまう場合は、変更することができます。
(注意: インスタンス生成直後に毎回書かなければならない。うんこ仕様)

my $tag = new Local::Util::TaggingDatabase($dbh);
$tag->{TAG_TABLE} = 'HOGE_TAG_TABLE';
$tag->{ITEM_TAG_TABLE} = 'FUGA_ITEM_TAG_TABLE';


アイテムデータにタグを登録、タグをクリアする場合、setItemTagListを使います。

# $id = アイテム毎のユニークなID
$tag->setItemTagList($id, $tag1, $tag2, $tag3); # tagはいくつでも指定可能
$tag->setItemTagList($id); # tag情報のクリア


アイテムデータが持つタグを全て得るなら、getItemTagListです。

my @tags = $tag->getItemTagList($id);


タグが設定されているアイテムのIDを得るには、getItemIDListです

my @itemids = $tag->getItemIDList($tag);

test.pl動作結果

--- アイテムが持つタグを得る ---
1 : Programing C++
tags: [Programing] [C++]
2 : Effective C++
tags: [Programing] [C++] [Effective]
3 : Programing Perl
tags: [Programing] [Perl]
4 : Effective Java
tags: [Programing] [Effective] [Java]
--- タグからアイテム名を得る ---
tag: Programing
[Programing C++]
[Effective C++]
[Programing Perl]
[Effective Java]
tag: C++
[Programing C++]
[Effective C++]
tag: Java
[Effective Java]
tag: Effective
[Effective C++]
[Effective Java]
tag: Hoge

感想

今までがテキストファイルやjava.util.Propertiesでデータを管理してて、データベースとかいらねえって考えだったのだけども、
社会ではデータベースが常識レベルの存在だったので、覚えなければならなくなったので、簡単に触れることにした。


パッケージ名は後で名前変えようと思ってたけど、めんどくさくなったのでいいや、と投げた。
@{[]}が便利すぎてJavaで生きるのが辛い。変数1個でも書くのがめんどいry
でももっとコードをきれいにかけるようになりたい。


DBI->connect時のattributeとして{RaiseError => 1, PrintError => 0}はデフォルトでほしい。
今回の場合、テーブルの初期生成時のみ、テストデータを追加するなどの処理をしたかったので
SQL文の実行失敗もdieしてくれると都合がよかった。


DBIがDBの違いを全部吸収してくれると思ったけどそんなことはなかった。
SQLコマンドは各DB依存な部分が結構あったりするので難しい。
効率が良い書き方がたくさんあるらしいので、そこらへんも考えていかなければならないと思った。


タグテーブルに1個カラム持たせるだけで、どのタグが良く参照されているかカウントする機能を持たせたりできそう。


スペルミスしてた。死にたい。