2010-12-07 5 views
3

スタンドアロンのCouchAppとしてURL短縮機能を書きたいと思っていますが、可能かどうかは疑問です。明らかに、URL短縮名の要点は、短くユニークなキーを持つことです。CouchDBの短いキーとユニークなキー

私が望むのは、長いURLをCouchDBにPOSTして短縮URLを取得することです。私は更新ハンドラを使用することを考えましたが、キーがユニークであるかどうかを確認するためにDBをクエリする必要がありました。これは可能ではないようです。

CouchDBで短くユニークなキーを生成する方法はありますか?あるいはCouchDBの周りに薄いラッパーが必要ですか?

答えて

2

私は、次のような構造を持つ文書に基づいて、薄いラッパーに行くだろう:新しい長いURLの

{ _id : short_url , url : long_url } 

の挿入は、単一のステップで行うことができる:ラッパーは新しい_idを生成している、試みをPUTを実行し、成功するまで新しい_idで再試行してください。これにより、すべての短いURLが一度だけ使用されることが保証されます。

この「生成、試行、再試行」アプローチは、一意性を保証する唯一の戦略であり、ラッパーなしでは利用できません。

同じ短いURLを再利用する場合は、echo(doc.url,null)というビューを追加して、存在する場合は_idを取得することもできます。これは、いくつかのクライアントが同じ長いURLを正確に同じ時刻に追加しようとしない限り、短いURLだけがその長いURLに使用されることを意味します。

+0

「生成、試行、再試行」戦略を実装することは外部プロセスで可能であることが分かりましたが、それほど大したものではありません。 http://wiki.apache.org/couchdb/ExternalProcesses –

+0

安全に複製できるように、文書_idがノード間で一意であることも確認する必要があります。 1つの方法は、各ノードに固有の接頭辞を追加することです。ただし、n * 64ノードしかないので、無制限にスケーラブルではありませんが、nは各ノード接頭辞に許可する文字数です(64はあなたの_idsで使用できる安全な文字の数です)。また、数百万のURLがある場合は、あなたがユニークな短いIDを取得する前に、あなたのPUTを何度も再試行しなければならないかもしれません... – ActionOwl