雪助におけるお気に入り機能

あんまり覚えてないので、リハビリがてら子育て*1の合間にちょこちょこ雪助を直し中。
んで、やりかけの機能にお気に入りってのがあったので、それをやってるんだけど、当時はひたすら面倒くさがってたけどこれちょっと面白い機能だったのでメモ。

雪助のデータ構造とお気に入れる範囲

最初に雪助のデータ構造を簡単に図説するとこう。
※ソーシャル機能が不十分なので、発言⇔ユーザという関連やユーザ⇔ユーザの関連はない

んで、お気に入れるものは何かというと、こう。

「お気に入りをお気に入りできるようにするか」と、「発言のお気に入りが発言ツリーなのか発言単体なのかそれとも両方なのか」とか悩みどころがいくつかあるけど、まあ基本全部お気に入れるよと。
自分自身の書き込みすべてとか、データ構造外のものもお気に入れるよと。
Facebookのライクみたいなもんだな。

お気に入りグループ

雪助のお気に入りを管理する画面ってのはこんな感じ。まだ完成してないけどね。

無駄なドラッグ&ドロップUI。
何してるかというと、それぞれお気に入りしたものをグルーピングしている。
画面だとわかりにくいので一応図説もいれると、こういう構造。

お気に入りのアイテムは複数のお気に入りグループに絡ませることが出来て、図だと発言1〜発言4がお気に入り1とお気に入り4の両方に関連されてる。
なぜ複数のグループに絡ませることが出来るかというと、このグルーピングがただユーザの整理のためのグルーピングというわけではなくて、グループされた内容で見ることを目的にしているものだから。
入れ物の外枠が視認出来る分フォルダっぽいんだけど、データ構造的にはタグ付けだね。

お気に入りグループの閲覧

例えば、PHPJavaScriptという二つのテーマでWebプログラムというグループに登録したとする。
PHPにA,B、JavaScriptにy,zという書き込みがあった場合、Webプログラムというグループはそれぞれ時系列に勝手に整列して、こんな風に入り乱れて表示する。

  1. A
  2. y
  3. B
  4. Z

これはユーザの発言であっても発言単体であってもURLに関する発言であっても全部そうで、グルーピングしたものすべてを時系列で勝手に並べ替えられると。
関心のあるもの、例えば俺ならサッカーとかゲームとか漫画とかのテーマを、まとめて時系列に表示することで最新の書き込みをチェックしやすいって形。

集約機能としてのお気に入り

結構昔に、「テーマの集約という課題」という題で書いたことがあるけど、
http://d.hatena.ne.jp/tsugehara/20121215/1355541434
ここで課題としていた複数テーマの集約を、単にテーマを集約するのではなく、テーマ以外のあらゆるものもお気に入りという形で集約出来るという形になったので、上手くまとめられたと思う。


ポイントは、

  1. 何でもお気に入りに出来る
  2. お気に入りしたものをグルーピングして表示できる

の2点ですな。


ユーザをお気に入りすればTwitterでいうフォローのような扱いになるし、発言をお気に入りすればTwitterのお気に入りになるし、テーマをお気に入りにすればブックマークした感じになるし、それらをまとめてグルーピングした上でまとめて新着チェックも出来るし、いろいろ便利。
作るのは結構面倒だけど、よくぞこの設計にしたなぁ1ヶ月ちょっと前の俺。とちょっと感心した。


このお気に入りすべて + 自分自身の書き込みがダッシュボードになれば、ほぼ完璧だなと。
ダッシュボードまでは今回やらんけど。

課題

先述したお気に入りをお気に入り出来るようにする、を悩んでいるのは、テーマの集約で述べた鹿島アントラーズ→J1→Jリーグ→国内サッカー→サッカーという階層構造を実現するためなんだけど、レンタルサーバなためリクエスト単位で処理しないといけない場合、このお気に入りをお気に入り出来るようにすると新着チェックがひどく重くなってしまう。


現状でもinsert into 〜 select 〜 unionの1クエリで更新全部持ってきて、表示処理はキャッシュされた内容表示するだけだけど、通常処理に比べるとやっぱり重いから、お気に入りページだけは勝手に新着をとってくることは出来ず、F5クリックが必要になったりもしてる。
ま、当初はお気に入りをお気に入りするなどはあきらめて、コンパクトにせざるを得ないでしょ〜ということで。

*1:といっても俺がやるのは大体トイレの処理くらいだが