Objets sociaux: meilleures pratiques pour la structure, le filtrage, le sorting et l’extensibilité de la firebase database

Nous sums en train de créer une plate-forme générique de réseau social d’entreprise dans ASP.NET MVC. Les objects sociaux publiés par les utilisateurs (mises à jour de texte, photos, blogs, vidéos, etc.) ou implicitement (“l’utilisateur assiste à un événement”, “l’utilisateur a mis à jour sa page”, etc.) constituent l’une des principales caractéristiques de tout site Web de réseautage social. .

Celles-ci sont essentiellement similaires: elles sont toutes affichées dans les stream d’activités des utilisateurs, dans les pages de groupe sur lesquelles ils sont publiés, dans les profils des utilisateurs qui les ont publiées et filtrées de manière similaire – par exemple, “affichez tout ce qui s’est passé dans les 7 derniers jours pour le groupe X avec le tag Y “.

Nous souhaitons définir quelques types de publication de base (blog, mise à jour de texte, participation à un événement, édition de page, etc.), mais nous avons la possibilité de les étendre facilement de manière à ce que revendeurs et clients du logiciel puissent append leurs propres types (par exemple, article de presse) avec leurs propres métadonnées et champs personnalisés (qui doivent pouvoir être recherchés / filtrés). Considérez-les comme l’équivalent “social” des listes Sharepoint!

Quoi qu’il en soit, la question que je me pose est la suivante: quelle est la meilleure structure de données pour y parvenir en termes de performances, d’évolutivité et de facilité d’extensibilité?

C’est ce que je pense actuellement (pseudo code / structure de la firebase database):

public class SocialObject { int Id; DateTime Date; ssortingng Url; ssortingng Title; ssortingng Text; Media[] Attachments; //photos, videos, links etc int OwnerId; //user who posted it int GroupId; //group it was posted to int PageId; //page it was posted to int PostTypeId; int? SourceId; //source - eg desktop client, email, web Like[] Likes; Comment[] Comments; Repost[] Reposts; Tag[] Tags; Mention[] Mentions; //user IDs mentioned in this post Metadata[] MetadataValues; } public class Metadata { int SocialObjectId; int MetadataTypeId; int? MetadataValueId; //for metadata types with list values - for filtering ssortingng Value; } 

(Tous les tableaux font référence à des tables séparées dans la firebase database)

Est-ce une façon sensée de le faire? – c’est-à-dire stocker tous les objects sociaux dans la même table (et permettre l’extension via la table de métadonnées pour des champs / informations supplémentaires) ou suis-je en train de fumer quelque chose que je ne devrais pas être? Gardez à l’esprit que ce tableau risque de devenir assez volumineux – 100 000 à des millions de lignes.

à la vôtre, Marcus

Ce message rédigé par un ingénieur de Facebook devrait vous donner une idée des principaux problèmes de mise à l’échelle. La plupart du temps, vous devez tenir compte de la rapidité avec laquelle vous pouvez générer / diffuser une liste de tous les messages publiés par les amis d’un utilisateur donné.

Vous trouverez également cette présentation vidéo de MySpace sur le même problème: http://ecn.channel9.msdn.com/o9/mix/10/mp4/EX04.mp4