ブログ・カテゴリ・アイテム・タグの関係
2008年8月14日
先日考えたブログ・カテゴリ・アイテムの関連は、このツールを正常に機能させるには十分であるが、表示のためのSQLクエリーがどのようになるかを考えてみると、どうやらあまりよくない構造になっているらしい。
例えば、あるブログに所属するアイテムの一覧を表示させる場合を考えてみる。これは、多くのサイトでは入り口のページを構成する場合に用いられていて、最もアクセスの多いケースである。先日の方法では、まずアイテムとカテゴリを関連付け、関連付けられたカテゴリをツリーテーブルに従ってどのブログに所属するかを決定し、所属ブログが指定のものになっているケースについて表示することになる。これは、SQLテーブルにインデックスを張ったとしても、無視できない量の情報を操作しなければならない。アイテムの数が増えてくると、表示速度の大幅な低下が起こりうる。
加えて、タグのついたアイテムを表示するケースでは、さらに複雑なクエリーを記述する必要がある。タグのそれぞれについて、所属先のブログを設定すればよいのだろうけれど、この場合には、アイテムの所属先が、タグで指定されたブログなのか、カテゴリーで指定されたブログなのかという問題が生ずる。
Nucleusの基本構造でこれがどうなっているかというと、一つのアイテムに一つのカテゴリ、一つのカテゴリに一つのブログが対応しているため、このようなややこしいことにはならない。現在のJeansではこの考え方に沿ったSQLクエリーによりアイテムの一覧を得ているが、クエリーの実行速度は極めて速い。
問題が生じるのは、サブカテゴリーやタグを実装するケースについてである。Jeansではコアでこれらをサポートすることを考えると、はじめからうまくSQLテーブルを構築できるような構造にしておくのが望ましい。
以上のことをかんがみて、Jeansにおける、ブログ・カテゴリー・アイテム・タグの関係を、以下の図のような構造で考えてみた。

先日の考え方とどう違うかというと、所属先のブログは、すべてのアイテム、すべてのカテゴリー、すべてのタグについて設定されていることである。つまり、ブログという概念は、アイテム・カテゴリー・タグといったほかの概念とはまったく異なり、それらを包括した存在であることが分かる。一方、アイテム・カテゴリー・タグは、それぞれの間で相互に関連しあうような概念ということになる。
この方式だと、ブログに所属するアイテムの一覧(サイトの表ページ)や、あるタグに所属するアイテムなどのSQLクエリーが簡潔に書けるという利点がある。他方、整合性の問題(あるアイテムを含むカテゴリの所属ブログと、アイテムの所属ブログが異なるなど)はあるが、これは時々チェックして、整合性が取れない場合は修復するようにしておけばよい。
例えば、あるブログに所属するアイテムの一覧を表示させる場合を考えてみる。これは、多くのサイトでは入り口のページを構成する場合に用いられていて、最もアクセスの多いケースである。先日の方法では、まずアイテムとカテゴリを関連付け、関連付けられたカテゴリをツリーテーブルに従ってどのブログに所属するかを決定し、所属ブログが指定のものになっているケースについて表示することになる。これは、SQLテーブルにインデックスを張ったとしても、無視できない量の情報を操作しなければならない。アイテムの数が増えてくると、表示速度の大幅な低下が起こりうる。
加えて、タグのついたアイテムを表示するケースでは、さらに複雑なクエリーを記述する必要がある。タグのそれぞれについて、所属先のブログを設定すればよいのだろうけれど、この場合には、アイテムの所属先が、タグで指定されたブログなのか、カテゴリーで指定されたブログなのかという問題が生ずる。
Nucleusの基本構造でこれがどうなっているかというと、一つのアイテムに一つのカテゴリ、一つのカテゴリに一つのブログが対応しているため、このようなややこしいことにはならない。現在のJeansではこの考え方に沿ったSQLクエリーによりアイテムの一覧を得ているが、クエリーの実行速度は極めて速い。
問題が生じるのは、サブカテゴリーやタグを実装するケースについてである。Jeansではコアでこれらをサポートすることを考えると、はじめからうまくSQLテーブルを構築できるような構造にしておくのが望ましい。
以上のことをかんがみて、Jeansにおける、ブログ・カテゴリー・アイテム・タグの関係を、以下の図のような構造で考えてみた。

先日の考え方とどう違うかというと、所属先のブログは、すべてのアイテム、すべてのカテゴリー、すべてのタグについて設定されていることである。つまり、ブログという概念は、アイテム・カテゴリー・タグといったほかの概念とはまったく異なり、それらを包括した存在であることが分かる。一方、アイテム・カテゴリー・タグは、それぞれの間で相互に関連しあうような概念ということになる。
この方式だと、ブログに所属するアイテムの一覧(サイトの表ページ)や、あるタグに所属するアイテムなどのSQLクエリーが簡潔に書けるという利点がある。他方、整合性の問題(あるアイテムを含むカテゴリの所属ブログと、アイテムの所属ブログが異なるなど)はあるが、これは時々チェックして、整合性が取れない場合は修復するようにしておけばよい。
コメント
Kat (2008年10月7日 10:42:24)
twitterでの議論メモ:
<%nucheader%>
の様な形で、htmlのhead要素を書き出すスキン変数を用意しておくと、おもしろいかも。ここから、プラグインのイベントを呼び出すようにすると、プラグインのコードがすっきりする可能性あり。
<%nucheader%>
の様な形で、htmlのhead要素を書き出すスキン変数を用意しておくと、おもしろいかも。ここから、プラグインのイベントを呼び出すようにすると、プラグインのコードがすっきりする可能性あり。