日記
カテゴリ管理のテスト実装Edit

もうずいぶん放置していた2ch type BBSを作ろう計画(コードネーム:Ich)。最近ずっとVB.NETばっかりやっていて脳みそが腐ってきた気がしたんで、ちょっと脳みそのリフレッシュのためにPHPを使ってリハビリすることにした。

Ich関係は頭の中でかなりいろいろこね回し続けていたんだけど、そう簡単に究極的な設計が思い浮かぶとも思えないんで、ひとまず思いつきの中からよさげな部分だけでも、実際に実装してみて、どんな感じになるのかをテストしてみることにした。で、いろいろパーツ的なものを作っているんだけど、プログラミング以外のところで一番悩みが深いのが、カテゴリ分類のこと。

2chなんかは長く続けているだけあって、かなりいい感じのカテゴリ(板)分類を持っているんだけど、ああいうフラットなやり方ではかなり制約が大きい。そこで、2chのようにカテゴリにスレッドが所属するという仕組みは捨て、スレッドは独立してフラットに存在しつつ、複雑な構造を持つカテゴリがスレッドへのポインタだけを持つ、という形式を考えてみた。

カテゴリは、それに所属するスレッドへのポインタ(ユニークID)のリストを持っている。複数のカテゴリが同じスレッドへのポインタを共有していてもかまわない。というか、共有しているのが前提。そうすることで、複数のカテゴリに所属するスレッドというものが表現できるようになり、自由度が大幅に高まる。

という前提の元に、カテゴリの構造を考えてみる。実装サンプルを別ウィンドウで参照しながら読むと、ちょっとは説明がわかりやすくなるかも。

カテゴリは、基本的に親子関係を持つツリー構造で表現される。ツリーのすべてのノードが、カテゴリとしての意味を持つ。子カテゴリに所属したスレッドは、自動的にすべての親カテゴリにも所属することになる。

ツリーで表現されるカテゴリは、できるだけプリミティブな意味を持つ厳選されたものだけにする必要がある。似たような意味を持つ違ったツリーが乱立しては、分類の意味がなくなってしまうだろう。ただし、ものごとをカテゴリ分類していくと、カテゴリ自体が複数のカテゴリに所属するようなものが出てくる。スレッドを複数のカテゴリに所属させるだけでは、そのあたりは表現しにくい。そういうものにも対応する必要がある。

そこで、カテゴリにリンク情報を持たせられるようにする。これはそのカテゴリに所属するスレッドは、リンクされた別のカテゴリにも自動的に所属することとなる、という意味を表すものだ。サンプルでは、各カテゴリの下に一段頭を下げて書かれている行が、リンクカテゴリとなる。たとえば、「/Computer/Hardware/PC本体/AT互換機/メーカーPC/VAIO」カテゴリは、「/組織/企業/ソニー」カテゴリへのリンク情報を持っているので、前者のカテゴリに所属するスレッドは自動的に後者のカテゴリにも所属することになる。今のところは、リンク先のさらにリンク先までは見ないことにする(懸案事項)。

といった感じでカテゴリというものを表現すれば、かなり柔軟にスレッドを表現できるのではないだろうか。ちなみにサンプルではテストのためにかなり細かい部分までカテゴリを用意してみたが、実際には最初の内は2階層程度まで用意しておき、それより深い部分についてはカテゴリわけする意味がでたら(=そのカテゴリに人気が出たら)、さらに子階層で細分化していく、といった感じの運用になるだろう。

ひとまずざっとやってみた思考実験では、これでかなりうまくいきそうなんだけど、一番問題なのは「ツリーで表現されるカテゴリは、できるだけプリミティブな意味を持つ厳選されたものだけにする必要がある」という部分。いろいろ考えてみた結果が、現在テスト実装に載せているような感じのものなんだけど、こういう方向でいいんだろうか? ツリーの作り方が間違っていたからといってルートから造り直すようなことになると、それまでのカテゴリ情報は破棄しなければならなくなるからな。

かといって、あんまり理想論的にツリーを作ってしまうと、意味なく複雑な(深い)ツリーになってしまって利便性が失われる。現実的に有用な(意味のある)レベルのルートから始めつつも、プリミティブ性は確保するという方針で作ってみているんだけど、結局こういうカテゴリってなものは、それで“森羅万象を表現できる”みたいな高度すぎる理想を持っているため、いくら思考実験してみても納得いくということがない。難しい。

ちなみに、こういう風にカテゴリ−ツリーデータを持たせると、カテゴリ内のスレッド一覧とかヘッドラインとかを生成する負荷がかなり高くなるんだけど、一応運用上は現実的な負荷(個人レベルのサーバー資産で)で収まる設計は思いついたんで、単なる理想論ってだけでなく実装も可能だと思う。ただ、基本的にPHP(Perlでもいいけど)+テキストファイルで完結して動くように設計していたんだけど、カテゴリ→スレッド方向のデータ連携はやっぱりDBに持たせないときつそうなんで、そこだけDBに(も)持たせる方針。なくても動くけれども、そうすると総カテゴリ数はかなり少なめにしておかないと、まともに(速度的に)動かなくなりそうだ。

Published At2002-06-07 00:00Updated At2002-06-07 00:00