2012-01-03 6 views
3

私が現在取り組んでいるアプリケーションでは、db4oをRavenDBに置き換えました。私はちょうど働いていなかった何かに気づいた、いくつかの研究をした、そして今私は健全性チェックが必要です。RavenDB - プロパティの参照

のは、このドメインモデルを想定してみましょう:

人の名前、住所、および車の特性を有しています。

車には、メイク、モデル、マイレージのプロパティがあります。

RavenDBでCarを作成して保存することができます。その後、私は人を作成し、人の車のプロパティに車を割り当てることができます。 Personを保存すると、CarはPerson内に保存されます。すべてはうまく見えます。

問題は、後でCar.Mileageを更新するときです。 CarはRavenDBでは更新されますが、Person.Carでは更新されません。 Person.Carには古い走行距離があります。

車はそれ単独で存在します。 Person Joeは車を所有でき、Person Nancyもそうすることができます。どちらのPersonオブジェクトもCarへの参照を持ちます。

RavenDBでは、どのように処理する必要がありますか?私が集計/ルートオブジェクトについて読んだことから、CarIdプロパティをPersonに追加する必要があるようです。次に、Personをロードするときに、IDでCarを手動でロードします。そうですか?または、Person内にCarプロパティを埋め込むことができます。また、Person.Car.MileageがPerson.Car.Mileageとして表示され、時間の経過とともにCar.Mileageが変更されることがあります。

+0

ボブ、それは一般的な質問であるように私はポストを書くでしょう。 –

+0

ありがとう、Daniel。全体的なアプローチについてコメントすることは可能ですか?明日までにこれを稼働させる必要があります。私はいつもそれを1つの方法で今日コード化し、後で変更することができますが、私は初めて正しくそれを行うことができます... –

+0

ちょうど数分待って... :) –

答えて

2

私が正しくあなたのモデルを理解している場合は、このような2つのドキュメント生成されています

{// cars/1 
    "Make": "Honda", 
    "Model": "Civic", 
    "Mileage": 250000 
} 

をそして、このように:

{// persons/1 
    "Name": "John Doe", 
    "Address": "...", 
    "Car": { 
    "Id": "cars/1", 
    "Make": "Honda", 
    "Model": "Civic", 
    "Mileage": 250000 
    } 
} 

それは、このドキュメントモデルであることが重要です。すべてのcarプロパティはPerson.Carプロパティで非正規化されています。あなたのコードでは、Car.Mileageを更新して保存します。

{// cars/1 
    "Make": "Honda", 
    "Model": "Civic", 
    "Mileage": 999999 
} 

そして、このような:

{// persons/1 
    "Name": "John Doe", 
    "Address": "...", 
    "Car": { 
    "Id": "cars/1", 
    "Make": "Honda", 
    "Model": "Civic", 
    "Mileage": 250000 
    } 
} 

あなたがするレイヴンに語ったまさにですあなたはこのように見える2文書で終わります。このドキュメントモデルでは、両方のドキュメントが一貫していることを確認するために、同じようにCarオブジェクトとそのカーを使用するすべての人物のPerson.Car.Mileageプロパティの両方を更新する必要があります。

データアクセスのニーズに応じて、モデルをいくつかの方法で変更できます。

{// cars/1 
    "Make": "Honda", 
    "Model": "Civic", 
    "Mileage": 250000 
} 

そして、このように:このドキュメントモデルで

{// persons/1 
    "Name": "John Doe", 
    "Address": "...", 
    "Car": "cars/1" 
} 

だけCar.Mileageプロパティを更新する必要があります1つのオプションは、お使いのモデルがこのように見えるようにすることです。このオプションを選択した場合は、単一のネットワーク要求で参照された文書をRavenから取得することもできます。

var person = session.Include<Person>(x => x.Car).Load("persons/1"); 
var car = session.Load<Car>(person.Car); 

これは、アプリケーションのニーズに対応するためにドキュメントモデルを変更する方法の1つだけのオプションです。

+0

お返事ありがとうございます。私はあなたの2番目のアプローチがRavenDBコミュニティに惑わされていると思います。それはまだ私がやる方法ですが。 :) –

関連する問題