2

RavenDBでキーとしてURLを使用する最良の方法は何ですか?

残念ながら、アイテムを更新するセマンティクスはドキュメントでは明確ではありません。キーがバックスラッシュで終わる場合、それは常に挿入です。そうでない場合、キーがすでに存在する場合は更新である可能性があります。

ただし、URLはスラッシュで終わる可能性がありますが、RavenDBはキー生成に終了スラッシュを使用します

RavenDBは、IDの概念もサポートしています。たとえば、IDを連続させる必要がある場合などです。エンティティに文字列Idプロパティを作成し、スラッシュ(/)で終わる値に設定することで、エンティティのキ​​ープレフィックスとして使用するようにRavenDBに指示できます。そのプレフィックスの後に次に使用可能な整数IDが続くと、SaveChanges()を呼び出した後のエンティティのIDになります。そして、そのスラッシュは再構成できません。したがって、実際にはそれを「サポート」しませんが、強制します。

編集:同じRavenDBドキュメントページに次のように記載されていますが、これは観察された動作に対応していません。

想像できるように、ドキュメントに任意のIDを割り当てることができます。すべてが正常に機能しますが、カスタム生成されたIDを持つドキュメントの数が非常に多い場合(数百万のドキュメント)、ある種のIDがパフォーマンスの問題を引き起こす可能性があることに注意する必要があります。

オプションは次のとおりです。1。URLを変更して終了スラッシュを削除します2.URLをURLエンコードします(RavenDBメンテナーによって提案されます)3。スキーマを変更し、データベースで生成されたIDを使用します

ほとんどの場合、オプション1は安全です。オプション2を使用すると、キーが読み取れなくなります。さらに、キーを機能させることができませんでした(RavenDBまたは私のコードのバグである可能性があります)。オプション3は、スキーマを不必要に複雑にしているようです。

一般的に、最善の行動方針は何でしょうか?

4

3 に答える 3

3

これは好みの問題だと思いますが、URL はあまり良いキーにはならないと思います。他の人は同意しません。サポート フォーラムでこのディスカッションを参照してください。

なぜそれがキーとして必要なのか、代わりに URL にインデックスを付けることができるかどうかについて、私は一生懸命考えます。例えば:

public class Site
{
    public string Id { get; set; } // such as "sites/1"
    public string Name { get; set; }
    public string Url { get; set; }
}

var q = session.Query<Site>().Where(x=> x.Url == "http://foo/bar");

これをキーとして使用する理由は、URL はリソースを一意に表すものであるということですが、http と https、オプションのクエリ文字列パラメーターなどを考慮すると、必ずしもそうとは限りません。

また、RavenDB ドキュメント キーは大文字と小文字を区別しませんが、URL は (一般に) 大文字と小文字を区別します。多くの Web サーバーはベース URL で大文字と小文字を区別しませんが、クエリ文字列パラメーターで大文字と小文字を区別するかどうかを決定するのは Web アプリケーション次第です。http://foo/bar?q=abcそのため、 と が 2 つの別々のリソースを参照する可能性はhttp://foo/bar?q=ABC十分にありますが、Raven ではそれらは同じドキュメント キーとして扱われます。

URL をドキュメント キーとして使用する必要があると思われる場合は、Ayende が述べたように、おそらく次のようにエスケープする必要があります。

// to escape
var key = Uri.EscapeDataString(url);


// to unescape
var url = Uri.UnescapeDataString(key);

同様に機能する他のエスケープまたはエンコード形式があると確信していますが、これが最も簡単なようです。

于 2013-02-12T15:24:21.367 に答える
1

ドキュメント キーとして使用する場合は、URL をエスケープする必要があります。

于 2013-02-12T13:32:34.527 に答える