RESTのインピーダンスミスマッチ

RESTって使いどころを誤ると大変だよね。
12
Takuto Wada @t_wada

@naka_aki_spl テーブルと1対1対応した CRUD へと誤読させるという意味で罠です。

2010-04-13 10:55:22
非実在naka aki @naka_aki_spl

設計次第といえばいいのかもですが、RDB(に限らないだろうけど)のデータ構造ってのは網目構造、いっぽうURLだと1次元構造になるので、どうもすっきりしないというか弱いなあと思った記憶が。>とりあえずRails2.2のroutes.rbを見てて思ったこと。

2010-04-13 10:56:06
なぎせ ゆうき @nagise

リソースを一個の独立したデータとして扱える場合についてはRESTが成り立つのは異論ないのだけど、Webをまたいだクライアント-サーバ間の汎用的な通信のプラットホームとして採用するのはなかなかうまくいかない、というのが2010年時点での私の評価

2010-04-13 10:56:39
非実在naka aki @naka_aki_spl

具体的かつ俺風にいえば「ゲッターロボ問題」つまりもともと順番が無い(自由)なものを「今ここでは」どういう順番に積めばいいのかが、一意に決まるわけじゃなく、そのへん厄介だなというか。

2010-04-13 10:57:01
Takuto Wada @t_wada

@nagise 一度 DB の CRUD から離れて、その URI で示されるリソースの DELETE とはどういう意味なのかを考える/設計するというのが大事だと思います。

2010-04-13 10:57:08
なぎせ ゆうき @nagise

.@t_wada だから、RIAとバックのDBをつなぐフレームワークの土台としてRESTを使う、というのはNGという結論なのですよ。URIで表現可能なリソースにデータ設計を落とし込まないといけませんよね?

2010-04-13 10:59:43
非実在naka aki @naka_aki_spl

@t_wada (R)DB設計のときも「このテーブルのデータの意味を考えて…それをDELETEするとはどういうことか考えて」みたいな設計上のフェースがあると思うんだけど、するとそれの上にRESTを載せると設計的に「屋上屋を架す」になる、のかな?

2010-04-13 10:59:47
なぎせ ゆうき @nagise

@mitukiii Webの自動巡回ソフトみたいなのはHEADメソッドを投げるものが結構ありますね。サーバ側がちゃんとLast-Modifiedヘッダとか返してくれないとむしろリクエストを多く投げることになるから微妙だったりもするのですがw

2010-04-13 11:01:12
Takuto Wada @t_wada

@naka_aki_spl @nagise ああなるほど! 主張がわかりました。確かに屋上屋を重ねるという側面はあると思います。追加で必要になる設計行為とそれに基づくインピーダンスミスマッチはあります。

2010-04-13 11:02:10
なぎせ ゆうき @nagise

.@t_wada そうか、これもインピーダンスミスマッチか。REST向きのデータ設計とRDBMSのデータ設計の間のインピーダンスミスマッチ。なるほど、なるほど。

2010-04-13 11:04:37
Takuto Wada @t_wada

@nagise む、ちょっとだけ誤読したかもしれません。データ設計を URI に合わせる必要はないと思います。中間層でデータ<->リソース変換すればいいし、だからこそインピーダンスミスマッチがあると言ったのです。

2010-04-13 11:05:50
なぎせ ゆうき @nagise

.@t_wada 中間層でデータ<->リソース変換をしたとして、完全に透過な変換が可能なのでしょうか? ごく単純にはあるリソースの排他制御みたいな例でもいいのですけど、バックヤードのDBのデータ構造に足を引きずられませんかね?

2010-04-13 11:08:42
なぎせ ゆうき @nagise

そういえばJSON形式もかなりやられたところはあって、JSONだとそのままでは参照型が存在しないから工夫しないと循環参照したオブジェクトを送ろうとして変換すると落ちる

2010-04-13 11:12:38
Takuto Wada @t_wada

@nagise うーむ、ちょっとこれは想像ですが (なんというか古めかしい感じの) DB 設計が既にある場合に、それに引きずられるというのはあるかもしれません。私自身の場合は、あまり困難を経験していません。答えになってませんね、すみません。

2010-04-13 11:12:38
t_yano @t_yano

@nagise RESTはDB構造よりもドメインとつなげた方がいいもんじゃないかと思った

2010-04-13 11:12:47
なぎせ ゆうき @nagise

.@t_wada なるほど。新規開発ならうまくやれるかもしれませんね。僕の場合はRIAとバックヤードのサービスをつなぐ汎用フレームワークの部分を作ったんですが、既存システムありだし、単純なマスタだったらRDBMSのレコードをまんまリソースとして扱いとか要求が無茶だったのかも

2010-04-13 11:16:12
Takuto Wada @t_wada

@nagise 例えば RIA でファイルの排他制御をする場合とかは、 /some_file/lock みたいなロックを意味する URI を設計し、その URI に対する PUT/DELETE とそのレスポンスコードでロックを表現しています。

2010-04-13 11:17:12
なぎせ ゆうき @nagise

.@t_wada WebDAVとやり方は一緒ですよね

2010-04-13 11:19:18
Takuto Wada @t_wada

@nagise RDBMS のレコードをまんまリソースとして扱うというのは、うまく行くところとそうでないところがあると思います。なるほど文脈がわかりました。

2010-04-13 11:19:27
なぎせ ゆうき @nagise

ふむ。RESTが使えないわけじゃなくて、RDBMSとのインピーダンスミスマッチがでかいから、既存システムの移植とか、その土台みたいなところで採用するなら覚悟しろってことなのかな。

2010-04-13 11:21:19