2013-02-14 24 views
14

Mi chiedo quale sarebbe la situazione migliore per la modellazione usando i riferimenti. Sto usando la libreria MongoRepository.MongoDB best practice per referenziamento

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

Quando si ripone la post voglio solo riferimento al proprietario dell'oggetto (Utente), invece di tutto l'oggetto sottostante.

Attualmente sto facendo in questo modo, non sapendo di meglio ...

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 e postRepository sono di tipo MongoRepository.

È questo l'approccio corretto per risolvere il mio problema usando MongoDB con C#/MVC (4)?

risposta

18

È possibile utilizzare oggetto DBRef anziché oggetto utente.

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

Quindi è possibile:

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 e FollowReference non esistono – iYonatan

10

Mongo è un database di documenti e se si è abituati a utilizzare SQL Server richiede un modo di pensare leggermente diverso.

Poiché non si desidera che i dettagli della password utente in ogni singolo post, il modo in cui probabilmente lo farei è quello di creare una nuova classe per contenere tutte le informazioni utente che potrebbero essere richieste per visualizzare un post.

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

Aggiornamento vostra entità postale, sostituendo la proprietà del proprietario, con una proprietà OwnerInfo, di tipo PostOwnerInfo.

Quindi, quando si crea un nuovo post, effettuare le seguenti operazioni.

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

In questo modo quando si esegue una query per un posto avrà tutte le informazioni utente che si richiedono per visualizzare il messaggio nella sua proprietà OwnerInfo senza ulteriori interrogazioni richieste.

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

C'è una certa quantità di ridondanza dei dati, ma in un database documento è così che farei.

Se per qualsiasi motivo sono necessarie le informazioni complete dell'utente, eseguire una query separata come prima.

L'idea è di archiviare tutte le informazioni utente necessarie per un post in un documento figlio del post, quindi non è necessario eseguire una query separata per l'utente.

Se le chaing dei dati utente, aggiornare il campo UserInfo su tutti i post creati dall'utente.

I dati dell'utente cambieranno raramente, ma la ricerca dei post verrà eseguita molto spesso.

+0

Questo è quello che cerco di evitare facendo riferimento. Se cambio l'utente, sarà diverso dall'utente nel post. Sarebbe male memorizzare User in Post perché contiene nome utente, password, ecc. Hai bisogno di un approccio intelligente per "aprire gli occhi" ... – Xatep

+0

Sì, hai ragione.Non vorrei davvero memorizzare i dati della password con ogni post. Aggiornata la mia risposta –