<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0"><channel><title>DBIC / Drkcore</title><link>http://blog.kzfmix.com/DBIC</link><description>Programming, Music, Snowboarding</description><language>ja</language><lastBuildDate>Mon, 07 May 2007 21:29:57 +0919</lastBuildDate><item><title>DBIx::Class::QueryLog</title><link>http://blog.kzfmix.com/entry/1178540997</link><description>&lt;p&gt;CatalystでDBICのプロファイリングがしたかったので&lt;a href="http://search.cpan.org/~gphat/DBIx-Class-QueryLog-0.03/lib/DBIx/Class/QueryLog.pm"&gt;DBIx::Class::QueryLog&lt;/a&gt;を使ってみた。&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="nv"&gt;$c&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Model&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;storage&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;debugobj&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$ql&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nv"&gt;$c&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Model&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;storage&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;debug&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nv"&gt;$c&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;stash&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;querylog&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$ql&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;とコントローラーに書いておく。&lt;a href="http://search.cpan.org/~blblack/DBIx-Class-0.07006/lib/DBIx/Class/Manual/Cookbook.pod#Profiling"&gt;ほんとはモデルのほうに書くべきなのか?&lt;/a&gt;クックブックよくわからん。&lt;/p&gt;
&lt;p&gt;あとは&lt;a href="http://www.onemogin.com/blog/554-profile-your-catalystdbixclass-app-with-querylog.html"&gt;View&lt;/a&gt;を用意すれば、結果（この場合は遅い順に5つ）が画面に吐き出される。&lt;/p&gt;
&lt;p&gt;&lt;img alt="log" src="http://www.kzfmix.com/images/blosxom/dbicql070507.png" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://search.cpan.org/~travail/Catalyst-Plugin-DBIC-Profiler-0.01/lib/Catalyst/Plugin/DBIC/Profiler.pm"&gt;Catalyst::Plugin::DBIC::Proflier&lt;/a&gt;もあとで。&lt;/p&gt;</description><pubDate>Mon, 07 May 2007 21:29:57 +0919</pubDate><category>DBIC</category></item><item><title>DBICで集約関数を使ってTTに送る場合に</title><link>http://blog.kzfmix.com/entry/1172152574</link><description>&lt;p&gt;タグのテーブルなんかでタグをカウントしてtagname(count)とか出力したいときにDBICだとどうやんのかな？と。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://en.yummy.stripper.jp/?eid=448071"&gt;http://en.yummy.stripper.jp/?eid=448071&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://d.hatena.ne.jp/nekokak/20061115/1163580576"&gt;http://d.hatena.ne.jp/nekokak/20061115/1163580576&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="http://5net.com/blog/2006/11/dbic_count_order_by.html"&gt;http://5net.com/blog/2006/11/dbic_count_order_by.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;$c-&amp;gt;stash-&amp;gt;{t_it} = 
$c-&amp;gt;model('DBIC::TableName')-&amp;gt;search(
    $query_ref,
    {   select   =&amp;gt; [ 'user_id', { count =&amp;gt; 'user_id' } ],
        as       =&amp;gt; [qw/ user_id posts_count /],
        group_by =&amp;gt; ['user_id'],
        order_by =&amp;gt; 'count(user_id) DESC',
    },
);&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;とasを指定しておけば、TTのほうで&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_column&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;posts_count&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;でカウントが表示できる。&lt;/p&gt;
&lt;p&gt;タグの名前とカウント数を表示させたい場合にはこのままTTでいいと思うが、タグクラウドにしたい場合は、コントローラーで&lt;a href="http://search.cpan.org/~lyokato/HTML-TagCloud-Extended-0.10/lib/HTML/TagCloud/Extended.pm"&gt;HTML::TagCloud::Extended&lt;/a&gt;とか&lt;a href="http://search.cpan.org/~lbrocard/HTML-TagCloud-0.34/lib/HTML/TagCloud.pm"&gt;HTML::TagCloud&lt;/a&gt;
を使ったほうがいいのかもと。&lt;/p&gt;
&lt;p&gt;あとYAPCのチケットとった。DBICネタが密かに楽しみだったり。&lt;/p&gt;</description><pubDate>Thu, 22 Feb 2007 22:56:14 +0919</pubDate><category>Catalyst</category><category>perl</category><category>DBIC</category></item><item><title>DBICのSingleメソッド</title><link>http://blog.kzfmix.com/entry/1170164392</link><description>&lt;p&gt;というか、findとの違いがいまいち。searchは分かるのでいいとして、&lt;/p&gt;
&lt;p&gt;&lt;a href="http://search.cpan.org/~bricas/DBIx-Class-0.07003/lib/DBIx/Class/ResultSet.pm" title="DBIx::Class::ResultSet - Responsible for fetching and creating resultset. - search.cpan.org"&gt;DBIx::Class::ResultSet - Responsible for fetching and creating resultset. - search.cpan.org&lt;/a&gt;
&lt;blockquote&gt;Inflates the first result without creating a cursor if the resultset has any records in it; if not returns nothing. Used by "find" as an optimisation.&lt;/blockquote&gt;&lt;/p&gt;
&lt;p&gt;カーソルを作らずに最初の結果をインフレートする、ただし結果がない場合はなにも返さない。&lt;/p&gt;
&lt;p&gt;じゃぁ、findって何？ってことになるわけだが。&lt;/p&gt;
&lt;p&gt;findって主キーから探すときにしか使ってなかったけど、ユニーク制約かけてあるとこから探してもいいのね。知らんかった。&lt;/p&gt;
&lt;p&gt;&lt;a href="http://search.cpan.org/~bricas/DBIx-Class-0.07003/lib/DBIx/Class/ResultSet.pm" title="DBIx::Class::ResultSet - Responsible for fetching and creating resultset. - search.cpan.org"&gt;DBIx::Class::ResultSet - Responsible for fetching and creating resultset. - search.cpan.org&lt;/a&gt;
&lt;blockquote&gt;Finds a row based on its primary key or unique constraint.&lt;/blockquote&gt;&lt;/p&gt;
&lt;p&gt;singleだと&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;Return&lt;/span&gt; &lt;span class="n"&gt;Value:&lt;/span&gt; &lt;span class="nv"&gt;$row_object&lt;/span&gt;&lt;span class="p"&gt;?&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;と?がついているのに、findは&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;Return&lt;/span&gt; &lt;span class="n"&gt;Value:&lt;/span&gt; &lt;span class="nv"&gt;$row_object&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;となっているということは、singleはオブジェクトを返すかもしれないし返さないかもしれないのに対し、findの場合は必ずオブジェクトが返ってくるということか。&lt;/p&gt;
&lt;p&gt;じゃぁ、ユニーク制約はどこでどうすんの？ってことだけど、
&lt;a href="http://search.cpan.org/~bricas/DBIx-Class-0.07003/lib/DBIx/Class/ResultSource.pm#add_unique_constraint"&gt;add_unique_constraint&lt;/a&gt;にあるようにDBICに制約属性ふっておけばいいらしいので、DBICが制約が張られているのをチェックしてよきに計らってくれるのだろう。(確認してないけど)&lt;/p&gt;
&lt;p&gt;というわけで、多対多とか一対多の場合に制約属性ふっておくと検索するときに楽になるのね。&lt;/p&gt;</description><pubDate>Tue, 30 Jan 2007 22:39:52 +0919</pubDate><category>DBIC</category></item><item><title>DBICでprefetchとjoin</title><link>http://blog.kzfmix.com/entry/1170077275</link><description>&lt;p&gt;ありがたい。色々勉強になりました。&lt;/p&gt;
&lt;p&gt;&lt;a href="http://d.hatena.ne.jp/nekokak/20070128/1169971870" title="Hatena::Diary::Neko::kak 500 Internal Server Error - CatはしらんけどSledgeなら"&gt;Hatena::Diary::Neko::kak 500 Internal Server Error - CatはしらんけどSledgeなら&lt;/a&gt;
&lt;blockquote&gt;基本コントローラーでRSを作りまくってstashにぶち込みまくって
Viewの方で実際にクエリを実行する感じですね。&lt;/blockquote&gt;&lt;/p&gt;
&lt;p&gt;というわけで&lt;a href="http://search.cpan.org/~bricas/DBIx-Class-0.07003/lib/DBIx/Class/Manual/Cookbook.pod#Using_joins_and_prefetch"&gt;cookbook&lt;/a&gt;みながら悩んでみた。いじってるのは、こんな感じのテーブルなので、&lt;/p&gt;
&lt;p&gt;&lt;img alt="多対多対多" src="http://www.kzfmix.com/images/blosxom/mtomtom.png" /&gt;&lt;/p&gt;
&lt;p&gt;user_bookmarksテーブルに対してイテレータをまわすことにした。
あとcatlystだとautoっていう最初(のほうに)に呼ばれるメソッドがあるので、そこにユーザーが存在するかどうかのバリデーション書いた。&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="k"&gt;sub &lt;/span&gt;&lt;span class="nf"&gt;auto&lt;/span&gt; &lt;span class="p"&gt;: Private {&lt;/span&gt;
    &lt;span class="k"&gt;my&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$c&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$action&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$username&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;@_&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="nv"&gt;$c&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;stash&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; 
      &lt;span class="nv"&gt;$c&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;PblDB::User&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;single&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$username&lt;/span&gt;&lt;span class="p"&gt;});&lt;/span&gt;

    &lt;span class="k"&gt;unless&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;defined&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$c&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;stash&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nv"&gt;$c&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt; &lt;span class="o"&gt;=~&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="o"&gt;!^&lt;/span&gt;&lt;span class="n"&gt;bookmarks&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="p"&gt;?&lt;/span&gt;&lt;span class="vg"&gt;$!&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;$c&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;redirect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$c&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;uri_for&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;/&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;sub &lt;/span&gt;&lt;span class="nf"&gt;default&lt;/span&gt; &lt;span class="p"&gt;: Private {&lt;/span&gt;
    &lt;span class="k"&gt;my&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nv"&gt;$self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$c&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;@_&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="nv"&gt;$c&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;stash&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;user_bookmark_it&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; 
    &lt;span class="nv"&gt;$c&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;PblDB::UserBookmark&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;search&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
          &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;user_id&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$c&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;stash&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
          &lt;span class="p"&gt;{&lt;/span&gt;       
             &lt;span class="n"&gt;prefetch&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;qw&lt;/span&gt;&lt;span class="sr"&gt;/user bookmark/&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
             &lt;span class="nb"&gt;join&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;qw&lt;/span&gt;&lt;span class="sr"&gt;/user bookmark/&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
             &lt;span class="n"&gt;order_by&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;me.id DESC&amp;#39;&lt;/span&gt;
           &lt;span class="p"&gt;}&lt;/span&gt;
           &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;あと、ユーザーバリデーションしてる件に関しては、&lt;/p&gt;
&lt;p&gt;&lt;a href="http://clip.livedoor.com/page/http://d.hatena.ne.jp/nekokak/20070128/1169971870" title="livedoor クリップ - Hatena::Diary::Neko::kak 500 Internal Server Error - CatはしらんけどSledgeなら"&gt;livedoor クリップ - Hatena::Diary::Neko::kak 500 Internal Server Error - CatはしらんけどSledgeなら&lt;/a&gt;
&lt;blockquote&gt;個人的には、バリデーションでユーザがいるかどうかはチェックしないなー。 そこでユーザの存在がわかっちゃうとあれかなと。まぁ、場合によるね。&lt;/blockquote&gt;&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;とか&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;ってやった場合に、ユーザがいない場合にそんなメソッドがないよってエラーになっちゃうので、バリデーションしたというのが経緯なのだが、join使えば、&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="k"&gt;sub &lt;/span&gt;&lt;span class="nf"&gt;default&lt;/span&gt; &lt;span class="p"&gt;: Private {&lt;/span&gt;
    &lt;span class="k"&gt;my&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nv"&gt;$self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$c&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$action&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$username&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;@_&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="nv"&gt;$c&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;PblDB::UserBookmark&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;search&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
          &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;user.name&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$username&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
          &lt;span class="p"&gt;{&lt;/span&gt;
             &lt;span class="n"&gt;prefetch&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;qw&lt;/span&gt;&lt;span class="sr"&gt;/user bookmark/&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
             &lt;span class="nb"&gt;join&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;qw&lt;/span&gt;&lt;span class="sr"&gt;/user bookmark/&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
             &lt;span class="n"&gt;order_by&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;me.id DESC&amp;#39;&lt;/span&gt;
          &lt;span class="p"&gt;}&lt;/span&gt;
          &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;と書けばよいのでこれでもいいかもしれんと思った。&lt;/p&gt;
&lt;p&gt;あと、実際のサービスでそういった場合の処理はどうしてんのかなと気になったので僕が使っているSBSで調べてみた。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;はてなブックマーク&lt;/li&gt;
&lt;li&gt;トップページに飛ばされる&lt;/li&gt;
&lt;li&gt;livedoor clip&lt;/li&gt;
&lt;li&gt;unregistration.html&lt;/li&gt;
&lt;li&gt;del.icio.us&lt;/li&gt;
&lt;li&gt;エラーページ&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ふむー。&lt;/p&gt;</description><pubDate>Mon, 29 Jan 2007 22:27:55 +0919</pubDate><category>Catalyst</category><category>DBIC</category></item><item><title>DBICで(多対多)対多</title><link>http://blog.kzfmix.com/entry/1169204642</link><description>&lt;p&gt;相変わらずCatalyst,DBICと戯れてる。で、テーブルも複雑になってくると。&lt;/p&gt;
&lt;p&gt;今回こんな感じのテーブルを扱ってみたが、なかなかうまく書けん。&lt;/p&gt;
&lt;p&gt;&lt;img alt="m2m2m" src="http://www.kzfmix.com/images/blosxom/mtomtom.png" /&gt;&lt;/p&gt;
&lt;h4&gt;User,Bookmarkからサーチする場合&lt;/h4&gt;
&lt;p&gt;うまい書き方が分からないので、リレーション張らんでもええような、ベタベタな構文になってしまう。&lt;/p&gt;
&lt;p&gt;勝手に二重のイテレータみたいになってくれればいいのに。&lt;/p&gt;
&lt;h4&gt;Tagからサーチする場合&lt;/h4&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="k"&gt;my&lt;/span&gt; &lt;span class="nv"&gt;$ub_it&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$c&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;PblDB::Tag&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$tag&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;user_bookmarks&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;while&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;my&lt;/span&gt; &lt;span class="nv"&gt;$user_bookmark&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;  &lt;span class="nv"&gt;$ub_it&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="k"&gt;next&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
    &lt;span class="nv"&gt;$item&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;$i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;title&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$user_bookmark&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;bookmark&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nv"&gt;$item&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;$i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;abstract&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$user_bookmark&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;bookmark&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;abstract&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;my&lt;/span&gt; &lt;span class="nv"&gt;$tag_it&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$c&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;PblDB::UserBookmark&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$user_bookmark&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;tags&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;みたいにuser_bookmarksテーブルのイテレータをまわさないといけないのだろうか？&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blog.kzfmix.com/entry/1162033241"&gt;ここらへんのも&lt;/a&gt;参考にする。&lt;/p&gt;</description><pubDate>Fri, 19 Jan 2007 20:04:02 +0919</pubDate><category>catalyst</category><category>DBIC</category></item><item><title>graphvizでテーブルスキーマ</title><link>http://blog.kzfmix.com/entry/1165315955</link><description>&lt;p&gt;地道にそれっぽいのを用意しようとするならば、こんな感じ&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;digraph&lt;/span&gt; &lt;span class="n"&gt;sample&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="n"&gt;graph&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;6, 8&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;   
   &lt;span class="n"&gt;graph&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;nodesep&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
   &lt;span class="n"&gt;node&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;shape&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;record&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;height&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mo"&gt;01&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;   
         &lt;span class="n"&gt;fontname&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;Helvetica&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fontsize&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;

   &lt;span class="n"&gt;bookmark&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;label&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;{bookmark|id\nname\nuri\ndescription\ntime_created}&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
   &lt;span class="n"&gt;tagmap&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;label&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;{tagmap|id\nbookmark_id\ntag_id}&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
   &lt;span class="n"&gt;tag&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;label&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;{tag|id\nname}&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;

   &lt;span class="n"&gt;tagmap&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;tag&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;label&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;belongs_to&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
   &lt;span class="n"&gt;tagmap&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;bookmark&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;label&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;belongs_to&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
   &lt;span class="n"&gt;tag&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;tagmap&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;label&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;has_many&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
   &lt;span class="n"&gt;tag&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;tagmap&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;label&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;many_to_many&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
   &lt;span class="n"&gt;bookmark&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;tagmap&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;label&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;has_many&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
   &lt;span class="n"&gt;bookmark&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;tagmap&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;label&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;many_to_many&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;dotコマンドで実行&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="nv"&gt;$&lt;/span&gt; &lt;span class="nv"&gt;dot&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Tpng&lt;/span&gt; &lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dot&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;o&lt;/span&gt; &lt;span class="n"&gt;db_sample&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;png&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;&lt;img alt="many to many " src="http://www.kzfmix.com/images/blosxom/dbic_mtm.png" /&gt;&lt;/p&gt;
&lt;p&gt;もう少し、スキーマ図っぽくしたいなぁと色々探したら&lt;a href="http://search.cpan.org/dist/SQL-Translator/lib/SQL/Translator/Manual.pod"&gt;SQL::Translator&lt;/a&gt;というものをみつけた。&lt;/p&gt;
&lt;p&gt;後で試す。&lt;/p&gt;</description><pubDate>Tue, 05 Dec 2006 19:52:35 +0919</pubDate><category>DBIC</category></item><item><title>DBICで多対多</title><link>http://blog.kzfmix.com/entry/1165232445</link><description>&lt;p&gt;多対多のサンプルとして&lt;a href="http://www.pui.ch/phred/archives/2005/04/tags-database-schemas.html"&gt;Tags: Database schemas&lt;/a&gt;の“Toxi” solutionをDBICで書いてみる。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;関連を表すテーブルに対しては、1対多の関係を設定しておいて、更にmany_to_manyを追加する&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;図にしてみたらわかりやすくなった。&lt;/p&gt;
&lt;p&gt;&lt;img alt="manytomany" src="http://www.kzfmix.com/images/blosxom/dbic_mtm.png" /&gt;&lt;/p&gt;
&lt;p&gt;ちなみに、1対多は&lt;a href="http://nekokak.jf.land.to/wiki/wiki.cgi/sub?page=Perl%2FDBIC#p17"&gt;こちら&lt;/a&gt;を、多対多は&lt;a href="http://d.hatena.ne.jp/nekokak/20061116/1163649019"&gt;こちら&lt;/a&gt;を参考にしました。&lt;/p&gt;
&lt;h4&gt;Kzfm::Schema&lt;/h4&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mo"&gt;00&lt;/span&gt;&lt;span class="mi"&gt;8008&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="n"&gt;strict&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="n"&gt;warnings&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="n"&gt;base&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;DBIx::Class::Schema&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;our&lt;/span&gt; &lt;span class="nv"&gt;$VERSION&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;0.01&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="n"&gt;__PACKAGE__&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;load_classes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;qw&lt;/span&gt;&lt;span class="sr"&gt;/Tag Bookmark TagMap/&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;h4&gt;Kzfm::Schema::Tag&lt;/h4&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="n"&gt;strict&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="n"&gt;warnings&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="n"&gt;base&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;Kzfm::Schema&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="n"&gt;__PACKAGE__&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;load_components&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;qw&lt;/span&gt;&lt;span class="sr"&gt;/PK::Auto::SQLite Core/&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;__PACKAGE__&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;table&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;tag&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;__PACKAGE__&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;add_columns&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;qw&lt;/span&gt;&lt;span class="sr"&gt;/id name/&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;__PACKAGE__&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;set_primary_key&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;id&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;__PACKAGE__&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;has_many&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tagmap&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;Kzfm::Schema::TagMap&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;tag_id&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;__PACKAGE__&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;many_to_many&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;bookmarks&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;tagmap&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;bookmark_id&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;h4&gt;Kzfm::Schema::Bookmark&lt;/h4&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="n"&gt;strict&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="n"&gt;warnings&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="n"&gt;base&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;Kzfm::Schema&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="n"&gt;__PACKAGE__&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;load_components&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;qw&lt;/span&gt;&lt;span class="sr"&gt;/PK::Auto::SQLite Core/&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;__PACKAGE__&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;table&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;bookmark&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;__PACKAGE__&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;add_columns&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;qw&lt;/span&gt;&lt;span class="sr"&gt;/id name uri description time_created/&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;__PACKAGE__&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;set_primary_key&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;id&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;__PACKAGE__&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;has_many&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tagmap&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;Kzfm::Schema::TagMap&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;bookmark_id&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;__PACKAGE__&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;many_to_many&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;tags&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;tagmap&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;tag_id&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;h4&gt;Kzfm::Schema::TagMap&lt;/h4&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="n"&gt;strict&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="n"&gt;warnings&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="n"&gt;base&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;Kzfm::Schema&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="n"&gt;__PACKAGE__&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;load_components&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;qw&lt;/span&gt;&lt;span class="sr"&gt;/PK::Auto::SQLite Core/&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;__PACKAGE__&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;table&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;tagmap&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;__PACKAGE__&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;add_columns&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;qw&lt;/span&gt;&lt;span class="sr"&gt;/id bookmark_id tag_id/&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;__PACKAGE__&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;set_primary_key&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;id&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;__PACKAGE__&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;belongs_to&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;bookmark_id&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;Kzfm::Schema::Bookmark&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;__PACKAGE__&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;belongs_to&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;tag_id&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;Kzfm::Schema::Tag&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;制約の部分だけ、考えてみる。&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;__PACKAGE__&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;belongs_to&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;カラム名(アクセサ?)&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;スキーマ(pm)&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;__PACKAGE__&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;has_many&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;テーブル名&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;スキーマ(pm)&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;カラム名(アクセサ?)&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;__PACKAGE__&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;many_to_many&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;任意のキー名&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;テーブル名&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;多対多関係のカラム&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;belongs_toはまぁわかりやすい。&lt;/li&gt;
&lt;li&gt;many_to_manyは任意にキー名決められるのにhas_manyはキー値にテーブル名指定しないとエラー吐くのが謎。&lt;/li&gt;
&lt;li&gt;many_to_manyでテーブル名のとこをKzfm::Schema::TagMapってやるのが駄目な理由がよくわからない。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;あと、さらにユーザーを追加する場合に、ユーザーとブックマークも多対多の関係になるけど、こっちも正規化したほうがいいのか、むしろやりすぎないほうがむしろいいのか悩む。&lt;/p&gt;
&lt;h3&gt;追記 06.12.04&lt;/h3&gt;
&lt;p&gt;&lt;a href="http://blog.kzfmix.com/entry/1165191647"&gt;ボケボケだったことに気付いた。&lt;/a&gt;&lt;/p&gt;</description><pubDate>Mon, 04 Dec 2006 20:40:45 +0919</pubDate><category>perl</category><category>sqlite</category><category>DBIC</category></item><item><title>DBICで多対多の設定を</title><link>http://blog.kzfmix.com/entry/1165191647</link><description>&lt;p&gt;&lt;a href="http://blog.kzfmix.com/entry/1165232445"&gt;かなりボケボケ&lt;/a&gt;だった。&lt;/p&gt;
&lt;p&gt;こういうことらしい。&lt;/p&gt;
&lt;p&gt;&lt;a href="http://search.cpan.org/~danieltwc/DBIx-Class-0.07002/lib/DBIx/Class/Relationship.pm" title="DBIx::Class::Relationship - Inter-table relationships - search.cpan.org"&gt;DBIx::Class::Relationship - Inter-table relationships - search.cpan.org&lt;/a&gt;
&lt;blockquote&gt;&lt;code&gt;&lt;strong&gt;PACKAGE&lt;/strong&gt;&amp;gt;$method_name('relname', 'Foreign::Class', $cond, $attrs);&lt;/code&gt;&lt;/blockquote&gt;&lt;/p&gt;
&lt;p&gt;というわけで、こんな感じの理解で。&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;__PACKAGE__&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;belongs_to&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;アクセサ名&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;任意&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; 
    &lt;span class="s"&gt;&amp;#39;従うクラス&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;従うクラスのIDを持つ属性名&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;__PACKAGE__&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;has_many&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;アクセサ名&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;任意&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; 
    &lt;span class="s"&gt;&amp;#39;クラス&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;自分のクラスのIDをもつ属性名&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;__PACKAGE__&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;many_to_many&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;アクセサ名&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;任意&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; 
    &lt;span class="s"&gt;&amp;#39;has_manyでのアクセサ名&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;belongs_toでのアクセサ名&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;データベースを指しているのかクラスを属性を指してるのか良く分かってなかった。というかO/RマッパーでDBのカラム名っておかしいよって何で気づかなかったんだろう。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;many_to_manyは任意にキー名決められるのにhas_manyはキー値にテーブル名指定しないとエラー吐くのが謎。&lt;/li&gt;
&lt;li&gt;has_many(アクセサ名(任意) =&amp;gt; 'クラス','カラム名')でOK&lt;/li&gt;
&lt;li&gt;many_to_manyでテーブル名のとこをKzfm::Schema::TagMapってやるのが駄目な理由がよくわからない。&lt;/li&gt;
&lt;li&gt;has_manyで指定したアクセサ名が必要なのでダメ。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;なんとなくこんな感じか。&lt;/p&gt;</description><pubDate>Mon, 04 Dec 2006 09:20:47 +0919</pubDate><category>Catalyst</category><category>perl</category><category>DBIC</category></item><item><title>belongs_toとhas_oneとmight_haveの関係</title><link>http://blog.kzfmix.com/entry/1162119526</link><description>&lt;p&gt;DBICのMLより&lt;/p&gt;
&lt;h4&gt;[Dbix-class] Difference between belongs_to and has_one&lt;/h4&gt;
&lt;blockquote&gt;Belongs to is a child -&gt; parent relationship
Has one is a sibling &lt;-&gt; sibling relationship?&lt;/blockquote&gt;

&lt;p&gt;has_oneはちょっと違うんじゃないかと。&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.ornithopter.jp/archives/2006/10/dbixclassdbic_d.html"&gt;101号室より愛をこめて&lt;/a&gt;に詳しい解説があった。&lt;/p&gt;
&lt;p&gt;家族の関係、核家族とか最近の4人家族のイメージだと&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;has_one,has_many&lt;/li&gt;
&lt;li&gt;親からみた子&lt;/li&gt;
&lt;li&gt;might_have&lt;/li&gt;
&lt;li&gt;兄弟姉妹みたいな関係（いるかもしれんしいないかもしれん）&lt;/li&gt;
&lt;li&gt;belongs_to&lt;/li&gt;
&lt;li&gt;子供からみた親の関係&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ぐらいに捉えておけばいいのか。&lt;/p&gt;</description><pubDate>Sun, 29 Oct 2006 19:58:46 +0919</pubDate><category>perl</category><category>DBIC</category></item><item><title>タギングの実装方法に関して</title><link>http://blog.kzfmix.com/entry/1162033241</link><description>&lt;p&gt;ここ半年以上、pubmedに特化したdel.icio.usクローンをcatalystで作って運用している。個人的には重宝してるが、Catalyst覚えたての頃作ったので、コードが汚かったり、タギングのあたりに色々不満があったので最近また書き直してる。&lt;/p&gt;
&lt;p&gt;書き直すモチベーション自体が、DBICを覚えたいという動機だったりするので、ほとんどスクラッチからっていう状態になってるが、pathinfoの再考できたりするのでこれはこれでいい感じ。&lt;/p&gt;
&lt;p&gt;で、ナイスなタイミングで&lt;a href="http://perlalchemy.blogspot.com/2006/10/tags-and-search-and-dbixclass.html"&gt;Tags and search and DBIx::Class&lt;/a&gt;というエントリがでてたので、ちょっと参考にしようかと。&lt;/p&gt;
&lt;p&gt;コメントで、&lt;a href="http://jpipes.com/presentations/tagging.pdf"&gt;Mysqlでの例&lt;/a&gt;が紹介されてたけど、
多分&lt;a href="http://www.pui.ch/phred/archives/2005/04/tags-database-schemas.html"&gt;Tags: Database schemas&lt;/a&gt;
のことでしょう。でも、これって単に正規化のレベルの話なんじゃ？&lt;/p&gt;
&lt;p&gt;いま動いてるのはとりあえずブックマークサービスを用意したいという要求から始まっていたので、MySQLiciousみたいなタグをスペース区切りで一つのフィールドに押し込むようにしてたんだけど、やっぱ多対多っぽくちゃんと正規化(“Toxi” solutionみたいに)すべきかナァと。&lt;/p&gt;
&lt;p&gt;でもこの場合、DBICって面倒じゃないんだろうか？deleteするときは一気に消せばいいだけだけど(cascadeってどうなるんだろうか?)、タグを消したり増やしたりする場合にはどういう感じに処理するんだろう？&lt;/p&gt;
&lt;p&gt;MySQLicious みたいなテーブル構成だと何も考えずにアップデートすればいいだけだったのであんま考えなくて楽だったんだよね。まぁ、逆にタグの集計とか面倒なんだけど。&lt;/p&gt;
&lt;p&gt;というわけで、そのうちちゃんと書いてみようと思った。&lt;/p&gt;</description><pubDate>Sat, 28 Oct 2006 20:00:41 +0919</pubDate><category>DBIC</category><category>mysql</category></item></channel></rss>