在 mysql 中存储 JSON 数据

Posted

技术标签:

【中文标题】在 mysql 中存储 JSON 数据【英文标题】:storing JSON data in mysql 【发布时间】:2012-05-06 22:58:18 【问题描述】:

例如,我有一个组织表

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

现在我想添加多个地址、电话和电子邮件。

像这样在email栏中存储json数据是不是一个好方法

[ "address2@example2.com", "address2@example2.com", "address2@example2.com" ]

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

如果存储 json 数据更好 - 在 rails 中使用它的最佳方式是什么?

【问题讨论】:

【参考方案1】:

将数据作为 JSON 字符串存储在单个数据库字段中意味着您将无法使用 SQL 操作/查询数据 - 这违背了将数据存储在数据库中的意义,您不妨将其存储在文本文件中。

我建议在您的组织表与电子邮件地址和电话号码表之间建立one-to-many 关系。见video explaining different relationship types

【讨论】:

谢谢。我认为 sql 方式更好,但这是问题所在。我不只在“组织”表中使用多封电子邮件。例如,如果我有 4 个表,每个表都需要多个电话、电子邮件和地址,这是创建“organization_emails”、“organization_phones”、“organization_addresses”、“othertable_emails”等的最佳方式吗? 在这种情况下,您需要一个“连接”或“连接”表 (en.wikipedia.org/wiki/Junction_table),因此您的连接表可能包含以下字段:ID(这将是 othertable.id 或组织.id)、Type(这将识别该记录用于哪个表,我通常将其作为 varchar 并使用字符串来识别和索引它)和telephone_id 这将告诉您从哪里获取电话号码 或者,如果您只有 2 张桌子,您可以在电话桌中使用 organization_idothertable_id【参考方案2】:

建议您将这些信息存储在一个表中。 根据您的要求。似乎使用一个好的多态模型会更好。

代码可能是这样的。

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

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

【讨论】:

【参考方案3】:

这是我发现的

http://api.rubyonrails.org/classes/ActiveRecord/Base.html

在文本列中保存数组、哈希和其他不可映射的对象

【讨论】:

以上是关于在 mysql 中存储 JSON 数据的主要内容,如果未能解决你的问题,请参考以下文章

在 MYSQL 中存储 JSON 数据 - 对性能的影响

在mysql(5.6)数据库中存储json数组的数据类型[关闭]

如何在 MySQL 数据库中存储 JSON 字符串

在 mysql 中存储 JSON 数据

在 MySQL 表中存储 JSON 数据

如何在 MYSQL 数据库中存储 API JSON 响应