在MySQL中存储JSON数据

9
我有一个组织表格的例子。
ID, name, address, phone, email, etc...

现在我想添加多个地址、电话和电子邮件。
像这样在电子邮件列中存储json数据是一个好方法吗?
[ "address2@example2.com", "address2@example2.com", "address2@example2.com" ]

或者创建另一个表用于电子邮件,另一个用于电话等...

如果存储JSON数据更好-最佳方法是如何在Rails中使用它?

3个回答

8

1
将数据存储为JSON字符串放在单个数据库字段中意味着您将无法使用SQL操作/查询数据 - 这有点违背了将数据存储在数据库中的初衷,您可能还不如将其存储在文本文件中。
我建议在您的组织表和电子邮件地址、电话号码表之间建立一对多关系。请参见解释不同关系类型的视频

谢谢。我认为使用SQL的方式更好,但是这里有一个问题。 我只在“组织”表中使用多个电子邮件。 例如,如果我有4个表,每个表都需要多个电话、电子邮件和地址,那么创建“organization_emails”、“organization_phones”、“organization_addresses”、“othertable_emails”等是否是最好的方法? - Nick Sanders
在这种情况下,您需要一个“连接”或“联接”表(http://en.wikipedia.org/wiki/Junction_table),因此您的联接表可能包含以下字段:`ID`(这将是othertable.id或organizations.id),`Type`(这将标识此记录所属的表,我通常只将其设置为varchar并使用字符串进行标识和索引),以及`telephone_id`,这将告诉您从哪里获取电话号码。 - rgvcorley
或者如果您只有两个表,您可以在电话表中只使用“organization_id”和“othertable_id”。 - rgvcorley

0

建议您将这些信息存储在单个表中。根据您的要求,使用良好的多态模型可能会更好。

代码可能如下所示。

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

如何使用

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

user.emails #=> ["abc@example.com"]
user.add_email "qq@example.com" #=> 
user.emails.first.remove

这些代码未经测试。但这是我的基本想法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接