23

参照を使用してモデリングするためのベストプラクティスは、どのような状況に置かれるのだろうかと思っています。MongoRepositoryライブラリを使用しています。

public class User : Entity
{
   publis string Id { get; set; }
   public string Email { get; set; }
   public string Password { get; set; }
}

public class Post : Entity
{
   public string Id { get; set; }
   public string Title { get; set; }
   public string Summary { get; set; }
   public DateTime Added { get; set; }
   public User Owner { get; set; }
}

投稿を保存するときは、基になるオブジェクト全体ではなく、所有者 (ユーザー) オブジェクトへの参照のみが必要です。

現在、私はこのようにやっていますが、より良い方法を知りません...

var post = new Post
{
   Title = "Example title",
   Summary = "asd asd",
   Added = DateTime.Now,
   Owner = new User { Id = "someExistingUserId" }
};
postRepository.Update(post); //Save

..

//Then to get the post
var post = postRepository.GetById("previouslySavedPostId");
post.Owner = userRepository.GetById(post.Owner.Id);
return post;

userRepository と postRepository は MongoRepository タイプです。

これは、C#/MVC(4) で MongoDB を使用して問題を解決するための正しいアプローチですか?

4

2 に答える 2

28

MongoDBRefUserオブジェクトの代わりにobjectを使用できます。

public class Post : Entity
{
    public string Id { get; set; }
    public string Title { get; set; }
    public string Summary { get; set; }
    public DateTime Added { get; set; }
    public MongoDBRef Owner { get; set; }
}    

次に、次のことができます。

var mongo = new Mongo(config.BuildConfiguration());
mongo.Connect();        
var DB = mongo.GetDatabase(_dataBaseName)

var post = new Post();
post.Owner = new MongoDBRef("User", userId); // First parameter is a mongoDB collection name and second is object id
// To fetch object referenced by DBRef you should do following
var owner = DB.FollowReference<User>(post.Owner);
于 2013-03-06T13:01:59.337 に答える
13

Mongo はドキュメント データベースであり、SQL サーバーの使用に慣れている場合は、少し異なる考え方が必要になります。

すべての投稿にユーザー パスワードの詳細が必要なわけではないので、投稿を表示するために必要なユーザー情報を含む新しいクラスを作成する方法が考えられます。

public class PostOwnerInfo
{
    public string UserId { get; set; }
    public string Name { get; set; }
}

投稿エンティティを更新し、Owner プロパティを PostOwnerInfo タイプの OwnerInfo プロパティに置き換えます。

次に、新しい投稿を作成するときに、次の操作を行います。

var user = userRepository.GetById(someExistingUserId);

var post = new Post
{
   Title = "Example title",
   Summary = "Example summary",
   Added = DateTime.Now,
   OwnerInfo = new PostOwnerInfo
   {
        UserId = user.Id,
        Name = user.Name
   }
};

postRepository.Update(post);

このように、投稿に対してクエリを実行すると、投稿を表示するために必要なすべてのユーザー情報がその OwnerInfo プロパティに含まれ、それ以上のクエリは必要ありません。

var post = postRepository.GetById(previouslySavedPostId);
// post.OwnerInfo will contain user info

ある程度のデータの冗長性がありますが、ドキュメント データベースでは、これが私が行う方法です。

何らかの理由で完全なユーザー情報が必要な場合は、以前と同じように別のクエリを実行してください。

投稿に必要なすべてのユーザー情報を投稿の子ドキュメントに保存するという考え方なので、ユーザーに対して個別のクエリを実行する必要はありません。

ユーザー データが変更された場合は、ユーザーが作成したすべての投稿の UserInfo フィールドを更新するだけです。

ユーザー データはめったに変更されませんが、投稿を頻繁にクエリします。

于 2013-02-14T15:44:23.720 に答える