3 votes

Blog architecture design

Je suis en train d'apprendre les rails, et je veux construire un blog similaire à tumblr. Il aura quelques types de messages différents, tels que du texte écrit, des messages photo, des messages audio et des messages vidéo.

Mon idée initiale était d'avoir des modèles différents pour chaque type de message, puisqu'il y aura des règles différentes pour chaque type de message. Cependant, je suis toujours en train d'apprendre et je ne sais pas ce que je ne sais pas, donc peut-être qu'il y a une meilleure façon de faire les choses (peut-être un seul modèle pour les messages et une table pour les types de messages ?)

Tout commentaire serait apprécié.

4voto

janechii Points 458

Une bonne base de données relationnelle et une bonne conception orientée objet consisteraient à avoir un modèle de message principal, qui partagerait probablement les mêmes attributs et comportements avec tous les types de messages. Il pourrait même servir de modèle pour vos messages de type "texte".

Cela pourrait également simplifier les relations avec les messages (par exemple, "les utilisateurs ont beaucoup de messages" par rapport à "les utilisateurs ont beaucoup de messages de texte et/ou de messages vidéo et/ou etc.)

Ensuite, vous disposez d'une sorte de table de jonction "pièces jointes", qui détermine le type de pièce jointe (afin que vous puissiez avoir plusieurs pièces jointes par message) :

CREATE TABLE attachments (post_id, media_type, media_id)

Ensuite, il y a une table et un modèle pour chaque type de média, avec des comportements spécifiques et des gestionnaires pour les types de médias.

CREATE TABLE audios (id, transcription, storage);
CREATE TABLE videos (id, location, format, storage);

Cela nécessitera probablement une sorte de relation polymorphe, ce qui pourrait être une conception de base de données discutable... vous aurez besoin de vues et de déclencheurs pour interroger facilement et maintenir l'intégrité... mais Rails le gère très bien.

Le modèle de poste aurait

has_many :attachments

et les pièces jointes auraient

belongs_to :post
belongs_to :media, :polymorphic => true

et chacun des modèles de médias aurait

has_one :attachment, :as => :media

alors vous pouvez accéder à vos médias via

post.attachments[0].media

Vous pouvez ignorer la table des pièces jointes et fusionner les attributs avec la table des messages si vous n'avez besoin que d'un seul type de média par message.

Désolé, je continue à éditer, je pense toujours à d'autres choses à dire :)

2voto

Brian Glick Points 1284

Voici quelques options qui pourraient fonctionner.

Tout d'abord, vous pouvez créer un modèle avec des colonnes pour les éléments suivants text_content , video_link , photo_link etc.

Ensuite, dans votre vue, vous pourriez rendre la vue du message à l'utilisateur (probablement en utilisant un partiel) avec un aspect différent selon les attributs qui ont des valeurs.

Une deuxième option serait de faire une plus petite Post qui ne contient que des informations clés et utiliser une série de relations "has_one" avec les autres éléments.

Le seul avantage que je vois à la deuxième option est que votre table de base de données serait plus petite puisque vous n'avez pas à représenter les cellules nulles à plusieurs reprises. À moins que vous ne soyez préoccupé par d'énormes problèmes d'échelle, je choisirais la première option.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X