web-dev-qa-db-fra.com

Structuration de la base de données pour "activité" multi-objets et «suivant» des fonctionnalités

Je travaille sur une application Web qui fonctionne avec différents types d'objets tels que des utilisateurs, des profils, des pages, etc. Tous les objets ont unique object_id.

Lorsque les objets interagissent, il peut produire une "activité", telle que l'enregistrement de l'utilisateur sur la page ou le profil. L'activité peut être liée à plusieurs objets par le biais de leur object_id.

Les utilisateurs peuvent également suivre des "objets" et ils doivent être capables de voir le flux d'activité pertinent.

Pourriez-vous me fournir certaines suggestions de structure de données qui seraient efficaces et évolutives? Mon objectif est de montrer une activité limitée aux objets que l'utilisateur suit Je ne suis pas limité par des bases de données relationnelles.

Mettre à jour

Comme je reçois des conseils sur ORM et de la manière dont les choses indiquent, je voudrais à nouveau, insister sur ma question. Selon mon modèle de conception actuel, la structure de la base de données ressemble à ceci:

enter image description here

Comme vous pouvez le voir, il est assez facile d'implémenter une base de données comme celle-là. Les tables d'activité et de suiveurs contiennent une quantité beaucoup plus importante d'enregistrements que le niveau supérieur, mais il est tolérable.

Mais quand il vient pour moi de créer une table "chronologie", il devient un cauchemar. Pour chaque utilisateur, j'ai besoin de faire référence à toutes les activités d'objet qu'il suivit. En termes d'enregistrements, il est facilement hors de contrôle.

S'il vous plaît suggérer comment changer cette structure pour éviter la création de timeline et également abair à récupérer rapidement l'activité pour tout utilisateur donné. Merci.

5
romaninsh

Il est difficile de dire sans savoir trop de plus, mais cela ressemble à vous voulez quelque chose de très générique. Peut-être que quelque chose comme ça pourrait aider:

 Activité 
 --------- 
 Activity_id - L'ID de l'activité [.____] Particiaire_Object_id - ID d'un objet participant [. ID du type d'activité 
 Activity_DateTime - Lorsque cette activité s'est produite 
 Données - Données de contexte de l'activité [.____]

Cela vous permettrait d'avoir des choses comme:

 Activité_id | participation_Object_id | activité_type_id | Date | données 
 ------------ + -------------------------- + ----- -------------- + ------ + ----- 
 1 | 2 | 3 | ... | Ceci est un post 
 1 | 84 | 3 | ... | [email protected] 

Ceci décrit une instance d'activité (ID n ° 1): un utilisateur (objet n ° 84, données de contexte "[email protected]") a créé une publication sur un forum (type d'activité 3) dont l'identifiant d'objet est 2, et l'affichage contenait la Texte "C'est un message".

Vous aurez probablement besoin de développer cela comme votre situation nécessite.

... En fait, maintenant que je pense à cela, la colonne data n'est probablement pas nécessaire, car vous pouvez obtenir des données que vous souhaitez à partir de votre base object table (tout ce qu'il semble) par Interroger en utilisant les valeurs de participating_object_id.

Une possibilité est d'utiliser "héritage", esp. Si les objets que vous faites référence ont des champs communs. Le schéma ressemble à ceci:

followables
    followable_id      primary key
    -- common fields

users
    user_id            primary key references followables(followable_id)
    -- user specific fields

pages
    page_id            primary key references followables(followable_id)
    -- page specific fields

...

random_entities
    ...
    followed_id        references followables(followable_id)

Cela signifie que les deux pages et users "sont" followables, ont des attributs followables '' et peuvent être référencés.

Les ormes créent souvent des schémas comme celui-ci pour modéliser l'héritage et gérer la jonction pour vous.

Ne vous inquiétez pas de l'inefficacité avant de pouvoir le prouver, c'est un problème.


wRT. efficacité. Écrivez un script SQL simple qui insère des informations de test jusqu'au nombre de rangées que vous avez jugées dont vous avez besoin. Ecrivez vos questions (rappelez-vous que vous ne voulez pas interroger votre calendrier entier, vous allez normalement LIMIT vos requêtes), vérifiez leur vitesse d'exécution - avec le matériel que vous mentionnez, je devine que la performance sera satisfaisante. Sinon, postez vos requêtes et des sorties de EXPLAIN.

2
alex

La dénormalisation sera votre ami ici - avez-vous envisagé de simplement faire une table de chronologie statique que vous pouvez choisir facilement?

Je voudrais également envisager fortement des magasins de données non relationnels ici - ils ont tendance à bien s'adapter à ce genre de problème.

1
Wyatt Barnett