web-dev-qa-db-fra.com

Stockage de tableaux dans la base de données: JSON vs tableau sérialisé

Je veux stocker un tableau de 3 éléments: les 3 derniers commentaires d'un post. Je sais que je pourrais joindre la table de commentaires à celle de Post, mais j'éviterais de faire cette lourde demande à des fins de mise à l'échelle.

Je me demandais donc quelle était la meilleure façon de stocker ces 3 éléments, car je voudrais les mettre à jour facilement chaque fois qu'un nouveau commentaire est fait: supprimer le dernier commentaire et ajouter le nouveau.

Quelle est la bonne façon de procéder? Le stocker dans un tableau sérialisé ou dans un objet JSON?

42
titibouboul

Vous pouvez stocker des tableaux et des hachages à l'aide de la déclaration serialize d'ActiveRecord:

class Comment < ActiveRecord::Base
  serialize :stuff
end

comment = Comment.new  # stuff: nil
comment.stuff = ['some', 'stuff', 'as array']
comment.save
comment.stuff # => ['some', 'stuff', 'as array']

Vous pouvez spécifier le nom de classe auquel le type d'objet doit être égal (dans ce cas Array). C'est plus explicite et un peu plus sûr. Vous n'aurez pas non plus à créer le tableau lorsque vous affecterez la première valeur, car vous pourrez l'ajouter au tableau existant (vide).

class Comment < ActiveRecord::Base
  serialize :stuff, Array
end

comment = Comment.new  # stuff: []
comment.stuff << 'some' << 'stuff' << 'as array'

Vous pouvez même utiliser une version plus soignée appelée store: http://api.rubyonrails.org/classes/ActiveRecord/Store.html

Cela devrait gérer votre cas d'utilisation à l'aide d'une méthode intégrée.

76
DiegoSalazar