2012-04-18 11 views
5

RavenDBを初めて使用しています。私はマルチマップインデックス機能を使用しようとしていますが、それが私の問題に対する最良のアプローチかどうかはわかりません。だから私は3つのドキュメント:ユニット、車、人々があります。RavenDBマルチマップインデックス

車の文書は、次のようになります。

{ 
    Id: "people/1235", 
    FirstName: "test", 
    LastName: "test" 
} 

とユニットDOC:

{ 
    Id: "units/4321", 
    Address: "blah blah" 
} 

これが私の本当で、略し例である

{ 
Id: "cars/123", 
PersonId: "people/1235", 
UnitId: "units/4321", 
Make: "Toyota", 
Model: "Prius" 
} 

人々のドキュメントは、次のようになりますより多くのフィールドがあるので、データの正規化が私の最後の手段になります。

この3つのドキュメントのすべてを1つのドキュメントにまとめて作成するインデックスを作成して作成する必要があります。このような何か:

{ 
    CarId: "cars/123", 
    PersonId: "people/1235", 
    UnitId: "units/4321", 
    Make: "Toyota", 
    Model: "Prius" 
    FirstName: "test", 
    LastName: "test" 
    Address: "blah blah" 
} 

// same unit different person owns a different car 

{ 
    CarId: "cars/122", 
    PersonId: "people/1236", 
    UnitId: "units/4321", 
    Make: "Toyota", 
    Model: "4runner" 
    FirstName: "test", 
    LastName: "test" 
    Address: "blah blah" 
} 

リレーショナルデータベースで、私はちょうど2つを使用するには、IDS によって人とユニットのテーブルに参加し、私の車のテーブルは、集約エンティティになります。ここで

は、私が持っているインデックス定義である:

public class MyMultiIndex : AbstractMultiMapIndexCreationTask<JoinedDocument> 
{ 
    public MyMultiIndex() 
    { 
     // creating maps 
     AddMap<Car>(cars => cars.Select(e => new { e.CarId, e.Make, e.Model, PersonId = e.PersonId, UnitId = e.UnitId, FirstName = (null)string, LastName = (null)string, Address = (nul)string })); 
     AddMap<People>(people => people.Select(e => new { CarId = (string)null, Make = (string)null, Model = (string)null, PersonId = e.Id, UnitId = (null)string, FirstName = e.FirstName, LastName = e.LastName, Address = (nul)string })); 
     AddMap<Unit>(people => people.Select(e => new { CarId = (string)null, Make = (string)null, Model = (string)null, PersonId = (null)string, UnitId = e.null, FirstName = (nul)string , LastName = (nul)string , Address = e.Address })); 

     Reduce = results => from result in results 
          group result by result.CarId 
          into g 
          select new JoinedDocument 
          { 
           CarId = g.Key, 
           PersonId = g.First(e => e.CarId == g.Key).PersonId, 
           UnitId = g.First(e => e.CarId == g.Key).UnitId, 
           Model = g.First(e => e.CarId == g.Key).Model, 
           Make = g.First(e => e.CarId == g.Key).Make, 

           **// this never works. It is like result set does not contain anything with this personId. It looks like AddMap for people document did not work.** 

           FirstName = results.First(e => e.PersonId == g.First(ie => ie.CarId == g.Key).PersonId).FirstName, 

           **// this never works. It is like result set does not contain anything with this personId. It looks like AddMap for people document did not work.** 

           LastName = results.First(e => e.PersonId == g.First(ie => ie.CarId == g.Key).PersonId).LastName, 

           **// this never works. It is like result set does not contain anything with this personId. It looks like AddMap for unit document did not work.** 

           UnitAddress = results.First(e => e.UnitId == g.First(ie => ie.CarId == g.Key).UnitId).LastName, 
          }; 
     Index(map => map.Model, FieldIndexing.Analyzed); 
     Index(map => map.Make, FieldIndexing.Analyzed); 
     Index(map => map.LastName, FieldIndexing.Analyzed); 
     Index(map => map.FirstName, FieldIndexing.Analyzed); 
     Index(map => map.Make, FieldIndexing.Analyzed); 
     Index(map => map.UnitAddress, FieldIndexing.Analyzed); 
    } 
} 

RavenDbが、私が提供した削減機能を実行しようとしたとき、私はエラーを表示このインデックスを実行します。私は人の姓と名字が存在するレコードに一致させようとしているときにエラーをスローします。同じことがユニットで起こります。

+0

メーリングリストのクロス投稿:https://groups.google.com/forum/?fromgroups#!topic/ravendb/Uym2tkvMaH8 –

+3

[This posts](http://ayende.com/blog/156225/relational) -searching-sucks-donrsquo-t-try-to-replicate-it)は、この問題を直接解決します。 –

答えて

1

ドキュメントデータベースをリレーションシップを持つオブジェクトモデルに合わせようとしているようです。このブログはあなたを助けることがあります。

Keeping a Domain Model Pure with RavenDB

これはRavenDBの推奨使用ではなく、時にはそれが必要だし、これはそれを処理するための良い方法であることに留意してください。

+0

私が理解するように、ここで最も簡単で推奨されるアプローチは、デノライズです。 – milagvoniduak

+1

私はあなたがRavenDBに真実を残したいと思ったら、はい、そうです。 –

+2

-1これはひどく脆弱な解決策ですが、著者はモデルを純粋に保つことについて語っていますが、関係は関係の意味を無視する意味があり、ORMを使って作業するときに間違ったものになります。 –

1

オーナーがいない車はありますか?または居住者のいない住所?どちらの場合もその偽の場合、私は車とユニットを人の中に埋め込むようにモデル化します。人はあなたの集団の根になり、車やユニットに着くためには人を通らなければなりません。

+0

はい、それは本質的に私がしなければならないことでした。 – milagvoniduak