CouchDB 徒然

http://d.hatena.ne.jp/starpos/20090214/1234629921

ブクマコメントにしようと思ったが整理をかねて1日記エントリで。いやー、データベースとしての Lotus Notes/Domino はニッチだなぁwww

また,せっかく replica があるのに,読み込みの負荷分散もデータベースシステムとしては現状では意識していないのではないかと思われます.

そうですね。replication で 負荷分散 を実現するためにはpartitioningに対する何らかのポリシーが必要で、その辺はMLを眺めていてそろそろ検討/実験しようか、といった感じです。とりあえず現状はmod_proxy_balancer で、という感じでしょうか(L4でバランスさせるのは結構つらい。

最近のMLの話題を拾うと、Clustering/Partitioningについては以下が参考になりそうでしょうか。

http://mail-archives.apache.org/mod_mbox/couchdb-dev/200902.mbox/%3Cb95ea6320902191734v3e16b691l22816dd94c95c39b@mail.gmail.com%3E

http://github.com/bbrowning/couchspray/tree/master

個人的には,データのセマンティクスは可能な限りデータベース側に集約させて,かつ柔軟性があるものを実現することは可能であり,また,そうするべきだと思っています

こちらは、個人的には、システムとしてデータベースとアプリケーションを明確に区別する必要があるかどうか、というのが気になるところです。アプリケーションのsemanticsはどこにいくのでしょうか。CouchDBの場合は、例えば「デザインドキュメント」という形でデータベースに集約されます。このほか、phprubyなどのスクリプトコードをデータベースに放り込むなども実験中、XAMLMXMLもおいていいんじゃないか、とか思ったりもします。データベース自体がアプリケーションそのものを置いておく場所として使うのもありかなぁと*1

あとは、Webはハイパーメディアのためのデータベースである、と考えるのであれば、このコンテキストで言うところのアプリケーションもデータベース側かな、と思いました*2

(大変なのはほとんどJoin).MapReduce は高速な実行メソッドがほぼ一意に決まります.

で、

Product や Joinは,MapReduce を直列に実行することでエミュレートできますが,本来はもっと高速に実行できるはずです

ということで、Join を考え出すと、直列MapReduceが必要になって、現時点の実装だと直列MapReduceができないので、そもそもJoinした状態でデータを格納せい、という事になる場合もあります。そうなるとデータの正規化云々の話になるんですが、そもそも正規化いらないんじゃ?、という思想が見え隠れしますね。そもそも関係性を記述、処理するためのデータベースではないですし。

CouchDBMapReduce 処理は,全ての Replica に対して,処理を分散させているのかどうか,ちょっと確認できていません.

しませんね。というか、CouchDBのレプリカは単なるデータのレプリカというより、アプリケーション状態の複製であると思っています(MapReduceの処理を記述したJavaScriptすらも複製の対象です)。なので、リレーショナルデータベースのレプリケーションとは少し違うのかな、と思っています*3

オフライン時でもアプリケーションを動かせて,オンラインになったら勝手にデータをサーバと同期する用途に使う分にはいいかも知れません.

これはもちろんのこと、前述のように、データだけを同期するわけではないので、アプリケーション処理そのものも同期することができますね。単なるデータ同期とかだと、もはやSQLiteですらいける状況なので、どうなんだろう、という気はします。

データベースシステムとしてはあまり期待できません.

これまでの「データベース管理システム」に求められる要件からはすごく外れますかね。システムストアシステム、とか意味不明なことをいってみる。

*1:明確にだめな理由が見つからないだけで、正しさを証明はでいないですが

*2:じゃ、アプリケーションって何よ?っていう話になると例えば、ブラウザなのかなと

*3:そこでLotus Notesがだな、という話をすると通じる人には通じるw