2012-04-26 12 views
7

Mam tabelę organizacji npprzechowywania danych JSON w mysql

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

Teraz chcę dodać kolejne adresy, telefony i e-maile.

Czy to dobry sposób na przechowywanie danych w kolumnie json email jak ten

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

lub utworzyć inną tabelę tylko do e-maili, a drugi dla telefonów itp ...

Jeśli przechowywania danych JSON jest lepszy - jaki jest najlepszy sposób użycia go w szynach?

Odpowiedz

1

Przechowywanie danych w postaci ciągów JSON w jednym polu bazy danych oznacza, że ​​nie będzie można manipulować danymi w SQL-ie, które to, co pokonuje punkt przechowywania danych w bazie danych, można również przechowywać w pliku tekstowym.

Polecam relację one-to-many między tabelą organizacji a tabelami dla adresów e-mail i numerów telefonów. Patrz: video explaining different relationship types

+0

Thansk. Myślę, że sposób sql jest lepszy, ale tutaj jest problem. Nie używam wielu e-maili tylko w tabeli "organizacji". Na przykład, jeśli mam 4 tabele i każdy z nich potrzebuje wielu telefonów, e-maili i adresów jest to najlepszy sposób na utworzenie "organization_emails", "organization_phones", "organization_addresses", "othertable_emails", etc ...? –

+0

W tym przypadku potrzebujesz tabeli "skrzyżowania" lub "dołączenia" (http://en.wikipedia.org/wiki/Junction_table), więc twoja tabela dołączeń może zawierać następujące pola: 'ID' (to będzie inna tabela. id lub organization.id), 'Type' (to zidentyfikuje tabelę, dla której przeznaczony jest ten rekord, zwykle mam to jako varchar i używam łańcucha do identyfikacji i zindeksowania) i' telephone_id' to powie ci, gdzie pobrać numer telefonu od – rgvcorley

+0

Lub jeśli masz tylko 2 tabele, możesz mieć po prostu 'organization_id' i' othertable_id' w twoim telefonie – rgvcorley

0

sugerują, aby przechowywać te informacje w pojedynczej tabeli. zgodnie z wymaganiami. Wydaje się, że lepszy będzie dobry model polimorficzny.

Ten kod może się tobą podobać.

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 

jak używać

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

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

te kody nie testowane. ale to jest mój podstawowy pomysł.

Powiązane problemy