2012-04-26 16 views
7

que tienen una tabla de organización, por ejemplo,almacenamiento de datos JSON en MySQL

ID, name, address, phone, email, etc... 

Ahora quiero agregar varias direcciones, teléfonos y correos electrónicos.

¿Es una buena manera de almacenar datos JSON en columna de correo electrónico como este

[ "[email protected]", "[email protected]", "[email protected]" ] 

O crear otra tabla sólo para mensajes de correo electrónico y otra para los teléfonos, etc ...

Si el almacenamiento de datos JSON es mejor - ¿Cuál es la mejor manera de usarlo en los rieles?

Respuesta

1

Almacenar datos como una cadena JSON en un solo campo de la base de datos significa que no podrá manipular/consultar los datos mediante SQL, lo que perjudica el almacenamiento de los datos en una base de datos. en un archivo de texto.

Recomendaría una relación one-to-many entre la tabla de su organización y las tablas de direcciones de correo electrónico y números de teléfono. Consulte video explaining different relationship types

+0

thansk. Creo que la forma sql es mejor, pero este es el problema. No estoy usando varios correos electrónicos solo en la tabla "organización". Por ejemplo, si tengo 4 tablas y cada una de ellas necesita varios teléfonos, correos electrónicos y direcciones, ¿es esta la mejor manera de crear "correos de organización", "teléfonos de organización", "direcciones de organización", "otros correos electrónicos", etc.? –

+0

En este caso necesita una tabla 'junction' o 'join' (http://en.wikipedia.org/wiki/Junction_table) para que su tabla de unión pueda contener los siguientes campos: 'ID' (esta será la otra opción). id or organizations.id), 'Type' (esto identificará para qué tabla es este registro, generalmente solo tengo esto como varchar y uso una cadena para identificarlo e indexarlo) y' telephone_id' esto le indicará dónde obtener el registro número de teléfono de – rgvcorley

+0

O si solo tiene 2 tablas, puede tener 'organization_id' y' othertable_id' en su mesa telefónica – rgvcorley

0

le sugerimos que almacene esa información en una sola tabla. según su requisito. Parece que usar un buen modelo polimórfico será mejor.

Al código puede gustarle esto.

module MultiAttr 

    def self.included(base) 
    base.send :extend, ClassMethods 
    end 

    module ClassMethods 
    def multi_attr(*args) 
     args.each do |attr_name| 
     class_eval <<-EOF 
      has_many attr_#{attr_name}, :class_name => "MultiAttributes", :as => :owner, 
      :conditions => {:key => '#{attr_name.singularize}'} 

      def add_#{attr_name.singularize}(val) 
      self.attr_#{attr_name}.create(:key => #{attr_name.singularize}, :value => val) 
      #{attr_name} 
      end 

      def #{attr_name} 
      self.attr_#{attr_name}.map(&:to_attr_model) 
      end 

     EOF 
     end 
    end 

    end 


end 

class AttrModel < String 

    def initialize(record) 
    @record = record 
    super(record.value) 
    end 

    def remove 
    @record.destroy 
    end 

end 


#owner_type, owner_id, key, value 
class MultiAttribute < ActiveRecord::Base 
    belongs_to :owner, :polymorphic => true 

    def to_attr_model 
    @attr_model ||= AttrModel.new(self) 
    end 
end 

cómo usar

class User < ActiveRecord::Base 
    include MultiAttr 
    multi_attr :emails, :addresses 
end 

user.emails #=> ["[email protected]"] 
user.add_email "[email protected]" #=> 
user.emails.first.remove 

estos códigos no han sido evaluados. pero es mi idea básica.

Cuestiones relacionadas