yosshyの日記: Teamblog + MongoDB
Teamblog と MongoDB を組み合わせてみた。
投降一覧画面でタグエイリアスが効かない事を除いて、移植完了。
元々の Teamblog は MySQL を使っていたが、移植してみてドキュメント志向DBの威力が嫌という程分かった。
●タグクラウドの実装が簡単
MySQL 版では、タグクラウドの為に2つのテーブル(記事、記事⇔タグ)を使っていた。これは 記事:タグ=1:N の関係になるため、正規化する必要があったからだ。
ところが、MongoDB はドキュメント志向DBであるため、1:N の関係にあるデータを分割する必要がない。1記事の「タグ」データ中にタグの配列を自然な形で保持できる上、単数/複数のタグを指定して記事を検索する事が当たり前のようにできる。
具体的には、posts コレクション(SQL のテーブル)の tags アトリビュート(SQL のカラム)に対して、「タグ」と「たぐ」を含むドキュメント(SQL のレコード)を検索するクエリは下記の通り。
db.posts.find({tags:{$all:['タグ', 'たぐ']}})
また、MongoDB ではタグクラウドに必要な「タグの集計機能」を MapReduce でできる。ただ、サンプルのコードでは何もタグが選択されていない場合の集計になる為、MongoDB 版の Teamblog ではタグクラウドの「残りタグ」集計を自前で行っている。
上記のようにタグクラウド関係がシンプルになった結果、MongoDB 版 Teamblog では随分コードがシンプル化した。
---
タグクラウドは MongoDB の威力のほんの一例でしかない。
例えば、ACL(アクセス制御情報)も SQL DB では正規化で記事テーブルから分割される事が多いが、MongoDB ではその必要がない。「記事」を管理するデータの塊の中に ACL やタグ情報を持たせてしまう事ができる。
例:u00001 がアクセス可能な記事の一覧を取得
db.posts.find({acl: 'user:u00001'})
例:ユーザ u00001 がグループ g100, g200 に所属する場合にアクセス可能な記事の一覧を取得
db.posts.find({acl:{$in:['user:u00001', 'group:g100', 'group:g200']}})
これほど簡単なアクセス制御の問い合わせが未だかつてあったろうか?
正に目から鱗が落ちるようだ。
Teamblog + MongoDB More ログイン