2015-10-03 24 views
6

MongoDB modelinin Facebook'a benzeyeceği bir proje üzerinde çalışıyorum. Bu yüzden hepimiz FB'nin nasıl çalıştığını biliyoruz, bir kullanıcı bir grup/şirket sayfasını "beğenir" ve kullanıcı bu sayfadaki tüm yayınları görecektir.C# mongodb model gibi Facebook

Aşağıdaki modeli nasıl tasarlamalıyım? Bir Sayfa milyonlarca içeriğe sahipse, her Post, gibi bir gibi bir alt alt belgeye sahip olacaktır. Bu doğru görünmüyor, düşünemediğim daha iyi bir yol olmalı.

Teşekkürler.

public class Person 
{ 
    public ObjectId Id { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
} 

public class Page 
{ 
    public ObjectId Id { get; set; } 
    public string Name { get; set; } 
    public List<Like> PersonLikes { get; set; } 

} 
public class Like 
{ 
    public ObjectId Id { get; set; } 
    public ObjectId UserId { get; set; } 
    public DateTime DateLiked { get; set; } 
} 

public class Post 
{ 
    public ObjectId Id { get; set; } 
    public ObjectId PageId { get; set; } 
    public string Message { get; set; } 
    public List<Like> PersonLikes { get; set; } 
} 
+0

Herhangi bir öneriniz var mı? – Curtis

+0

İyi bir soru, her şeyin yolunda gitmesi gerçeği göz önüne alındığında. Muhtemelen bunun gibi bir sayaç var ve daha sonra gerçek gibi bilgilerin saklandığı başka bir koleksiyona sahip olurdum. Senkronizasyon dışında mı olabilirler? Tabii ki, hiçbir işlem yok, ama sonra doğru olmanız gerekiyor mu? –

+0

**> Bu doğru görünmüyor, düşünemediğim daha iyi bir yol olmalı. ** Her şeyden önce - evet, doğru değil. Ve MongoDB kesinlikle bu çözüm için veritabanı değil, bu şema için SQL veritabanı ile daha iyi durumdasınız. Bu çözüm için mükemmel db, neo4j – sed

cevap

2

sadece izlemek istediğiniz varsayılarak Benim alabilir Sonra Reaksiyonu sıraya olurdu

public class Page 
{ 
    public ObjectId Id { get; set; } 
    public DateTimeOffset Date { get; set; } 
    public string Name { get; set; } 
    public int NumberOfLikes { get; set; } 
} 

public class Post 
{ 
    public ObjectId Id { get; set; } 
    public ObjectId PageId { get; set; } 
    public DateTimeOffset Date { get; set; } 
    public string Message { get; set; } 
    public int NumberOfLikes { get; set; } 
} 

sever (beğenin veya Beğenme) yerleştirme için, "duygu" bilgi gerçek saklanabilir zorunda değildir zaman, öyle mi? Bunlar ilaçlar, banka işlemleri vb değildir.

public class Like 
{ 
    public ObjectId Id { get; set; } 
    public ObjectId ParentId { get; set;} 
    public ObjectId UserId { get; set; } 
    public DateTimeOffset Date { get; set; } 
} 

Queue nerede? Likes koleksiyonuna. Neden sayfanın bir parçası değil mi? Çünkü eğer bir mesaj viral hale gelirse (çoğunlukta olmamakla birlikte söylediğiniz gibi), 1.000.000 beğeni ile sonuçlanabilir. Bu bilgiyi analitik bir motordan başka kim tarayacak?

Ayrıca, bir kullanıcının yalnızca tepkime maddelerine göre sadece bir kez ifade edebildiğinden emin olmanız gerekir.

+0

'Like' sınıfınız, sevilen Sayfa veya Postanın Kimliği eksik. –

+1

@IanMercer Ayrıca DateTime DateTimeOffset olarak değiştirildi. –

+0

Cevabınız için teşekkür ederiz. Her gönderinin beğenilmeye ihtiyacı yoktur. Gönderiyi görmek için sadece bir kullanıcıya ihtiyacım var. Yukarıdaki örnekte, tüm Post mesajlarını görüntülemek için Like collection "XXXXX" ile Like koleksiyonunu nasıl sorgularım? – Curtis

1

Gönderi yalnızca bir sayfada var, bu yüzden sayfanın sahibi değil gönderi sahibi olması gereken sayfa.

public class Person 
{ 
    public ObjectId Id { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
} 

public class Page 
{ 
    public ObjectId Id { get; set; } 
    public string Name { get; set; } 
    public List<Like> PersonLikes { get; set; } 
    public List<Post> Posts { get; set; } 
} 

public class Post 
{ 
    public ObjectId Id { get; set; } 
    public string Message { get; set; } 
    public List<Like> Likes { get; set; } 
} 

public class Like 
{ 
    public ObjectId Id { get; set; } 
    public ObjectId UserId { get; set; } 
    public DateTime DateLiked { get; set; } 
}