我的 Rails 应用程序中有一个收件人模型。收件人都有名字、姓氏和一些其他布尔属性。此外,这些收件人现在将收到额外的属性。用户可以有许多收件人,并且应该能够根据自己的需要扩展这些收件人数据集(例如街道、邮编、城市)。大多数用户不扩展收件人,有些人会存储其他几个数据,但我不知道用户需要哪些数据给收件人。为了避免街道、邮编、城市、电话号码或任何其他数据的数百个字段,我考虑了一种键值存储。密钥将保存在addressee_key_labels 中,每个addressee 和addressee_key_labels 的对应值都保存在addressee_key_value 中。
class User < ActiveRecord::Base
has_many :addressee_key_labels, :dependent => :destroy
end
class AddresseeKeyLabel < ActiveRecord :: Base
belongs_to: user
has_many: addressee_key_values, :dependent => :destroy
end
class AddresseeKeyValue < ActiveRecord :: Base
belongs_to: addressee
belongs_to: addressee_key_label
end
class Addressee < ActiveRecord :: Base
has_many: addressee_key_values, :dependent => :destroy
after_create :create_additional_values
def create_additional_values
unless self.user.addressee_key_labels.empty?
self.user.addressee_key_labels.each do |addressee_key_label|
addressee_key_value = AddresseeKeyValue.new()
addressee_key_value.addressee_key_label_id = addressee_key_label.id
addressee_key_value.addressee_id = self.id
if self.additional
if addressee_key_label.is_secure
addressee_key_value.sec_data = self.additional[addressee_key_label.xmlname.downcase]
else
addressee_key_value.data = self.additional[addressee_key_label.xmlname.downcase]
end
end
addressee_key_value.save!
end
end
end
end
对于许多新收件人和每个收件人的 10 个附加字段,我使用 faker gem 的测试往往非常慢,因为我有 11 个插入到数据库中(一个用于收件人,10 个用于附加字段)。当我创建 1000 个或更多收件人(计划从 xls-document 导入功能)时,该过程需要几分钟,因为收件人有一些验证。
在不失去回调可能性的情况下,我能做些什么来加快速度?
我考虑将数据以 json/xml 或其他格式存储到收件人表中。这是向数据库抛出更少查询的适当解决方案吗?