2012-03-19 13 views
2

私の例では、議論のために擬似C#コードを使用する予定ですが、これは単一の言語またはデータベースツールに固有のものではありません。データモデルによって駆動されるリソースIDは、リソースまたはデータベースの側面ですか?

私はnew Customer()を保存するときRavenDBを使用したシンプルなモデル

Customer { string Id }

を取る、それは "顧客/ 234" とし、実行時に私のためにIDを生成します。このシナリオでは、IDはRavenDBの面であると受け入れても問題ありません。基本的には、人間が理解できる意味を持たず、グローバルユニークさの目標(このデータベース)を達成するだけの識別子を作成するので、これは絶対にGuid.NewGuid().ToString()と変わりません。これは間違いなくGUIDのより良いバージョンであり、より良いURLを作成し、16のランダムな16進数の文字列よりはるかに簡単に必要な場合、人間がIDを伝えることを許可します。別のシナリオのテイクで

:このシナリオでは

User { string UserName, string Id }

私はユニークな番号とは対照的に、私のIDに本当の意味論的な意味を置きたいです。

はRavenDBでは、これを達成することができるに似て:あなたはで終わるだろうこのストア操作中に

は、私はまた、ユーザーを持つのではなく、することで、この近づくことができ、「ユーザ/ dotnetchris」

store.Conventions.DocumentKeyGenerator = (entity) => 
{ 
    User user = entity as User; 
    if(user == null) 
     return defaultKeyGeneration (entity); 

    return "Users/" + user.UserName; 
} 

読み取り専用のプロパティを使用して、IDの単純なプロパティを持っている:

User { 
    string Id { get { return "Users/" + UserName } 

私はこのconstruのために適切な場所であるこれらのかを決めるに苦労していますct。

これはあなたに実際にUsers.Where(user.UserName == "dotnetchris")

を見つけるためにdatbaseに照会する必要がなく、ユーザー入力からIDによりこのオブジェクトをロードするために簡単になるという情報を与えるとして、それは、直接クラスに含まれなければならない方に私が傾いています
+0

私がグローバルに使用しているすべての点私は自分のデータの範囲を指していますが、必ずしもGUID **が真に**ユニークな方法で世界的にユニークであるとは限りません。 –

+0

私は実際にこれらのソリューションの1つを実装しようとしています。私は世代がDocumentKeyGeneratorにあるのが好きです。なぜなら、それは鍵生成コードを単一の場所に分離するからです。しかし、RavenDbはIdを使ってエンティティをロードできるLoadを提供しています。また、適切なプレフィックスを持つIDをまだ持っていない場合は、キー生成システムの外でプレフィックスを適用する方法が必要です。 – ShaneH

+0

@ ShaneH私はそれが1の場所に隔離されていることに同意しますが、私はあなたのオブジェクトのすべてがその理解を失うので、それが良いことだとは思っていません。 Loadを満たすためにkeyPartからこれらのIDを構築する必要があれば、 'Id.For (this.RouteData)'のような振る舞いをするクラスを作成します。これはジェネリック型のスイッチになります。 HenriFormat(ルートデータ) 'https://gist.github.com/2170953 –

答えて

0

私はすべての単一の識別子がデータベースではなくアプリケーションによって所有されるように努めています。私がモデルのアイデンティティの所有権を渡す唯一の理由はパフォーマンス上の理由です。レプリケートされ、5億の行を持つSQLテーブル。

1

データがデータベース内でどのように参照されるかどうかに大きく依存するようです。データベースデザインに何らかの制約があるために「フル」ID(つまりUsers/name)が必要な場合は、それをデータベースに近づけておく方が良い選択ですが、そうでない場合は、 (最終的なコードサンプルごとに)コードの柔軟性を可能にするドメインモデルの一部です。

+0

ユーザー/名前はグローバル一意性を保証しますが、他のドキュメントのIDはそのIDを有効にすることはできません。ユーザーなしの場合、別のタイプで使用される場合、Nameの値は一意になると保証されなくなりました。これは標準的なRavenDBの慣例から導き出されたものですが、タイプ名を区切り文字として使用するという基本的な前提に同意します。したがって、RavenDBではIDが一意である必要があります(真のテーブルがないため)。一意の情報が得られることはビジネス上の必要条件でもあります。 –

+0

一意性が必要な場合は、データベースに近いほうが最適かもしれません。そうすることで、ユニークな識別子は、データベースおよび必要に応じてドメインモデルの両方において一意である。独自性が必要な場合(独自性が要求されない状況など)、その部分を取り除くのと同じくらい簡単です。 – Dulan

関連する問題