2013-02-14 26 views
14

Tôi tự hỏi thực hành tốt nhất để lập mô hình bằng cách sử dụng tài liệu tham khảo sẽ được đưa ra tình huống theo. Tôi đang sử dụng thư viện MongoRepository.MongoDB thực hành tốt nhất để tham khảo

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; } 
} 

Khi lưu trữ bài đăng tôi chỉ muốn tham chiếu đến chủ sở hữu (người dùng) thay vì toàn bộ đối tượng nằm bên dưới.

Hiện nay tôi đang làm nó như thế này, không biết các cách nào tốt hơn ...

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 và postRepository là loại MongoRepository.

Đây có phải là cách tiếp cận đúng để giải quyết vấn đề của tôi bằng cách sử dụng MongoDB với C#/MVC (4) không?

Trả lời

18

Bạn có thể sử dụng đối tượng DBRef thay vì đối tượng Người dùng.

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 DBRef Owner { get; set; } 
    }  

Sau đó, bạn có thể:

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

    var post = new Post(); 
    post.Owner = new DBRef("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); 
+1

DBRef và FollowReference không tồn tại – iYonatan

10

Mongo là cơ sở dữ liệu tài liệu và nếu bạn quen với việc sử dụng máy chủ sql, nó đòi hỏi một cách suy nghĩ hơi khác.

Vì bạn không muốn chi tiết mật khẩu người dùng trong mỗi bài đăng, cách tôi có thể làm là tạo một lớp mới để chứa bất kỳ thông tin người dùng nào có thể được yêu cầu để hiển thị bài đăng.

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

Cập nhật đối tượng bài đăng của bạn, thay thế thuộc tính Chủ sở hữu bằng thuộc tính OwnerInfo, thuộc loại PostOwnerInfo.

Sau đó, khi bạn tạo bài đăng mới, hãy làm như sau.

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); 

Bằng cách này khi bạn truy vấn bài đăng, nó sẽ có tất cả thông tin người dùng mà bạn yêu cầu hiển thị bài đăng trong thuộc tính OwnerInfo mà không cần truy vấn thêm.

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

Có một lượng dư thừa dữ liệu nhất định, nhưng trong cơ sở dữ liệu tài liệu, đây là cách tôi thực hiện.

Nếu bạn cần thông tin người dùng đầy đủ vì bất kỳ lý do gì, chỉ cần thực hiện truy vấn riêng cho nó như bạn đã làm trước đây.

Ý tưởng là bạn lưu trữ tất cả thông tin người dùng bạn cần cho bài đăng trong tài liệu con của bài đăng, vì vậy bạn không cần phải thực hiện truy vấn riêng biệt cho người dùng.

Nếu dữ liệu người dùng chages, chỉ cần cập nhật trường UserInfo trên tất cả các bài đăng của người dùng của bạn.

Dữ liệu người dùng của bạn hiếm khi thay đổi, nhưng bạn sẽ thường xuyên truy vấn các bài đăng.

+0

Đây là những gì tôi cố gắng tránh bằng cách tham khảo. Nếu tôi thay đổi Người dùng, thì nó sẽ khác với Người dùng trong Bài đăng. Nó sẽ là xấu để lưu trữ người dùng trong bài vì nó có chứa tên người dùng, mật khẩu, vv Cần một cách tiếp cận "mở mắt" thông minh ... – Xatep

+0

Có bạn là chính xác.Sẽ không thực sự muốn lưu trữ dữ liệu mật khẩu với mỗi bài đăng. Đã cập nhật câu trả lời của tôi –

Các vấn đề liên quan