我们有多个来自不同数据源的商店列表,这些商店必须匹配。
商店有一个复合主键[source,id]。匹配在商店表中创建一个单独的条目,其中source = 0,并提取可能与源不同的值(name,url,...)。
现在我可以将另外两列meta_shop_source和meta_shop_id添加到商店,将belongs_to:meta_shop,class_name“Shop”,foreign_key:[:meta_shop_source,:meta_shop_id]添加到商店模型。我正在使用composite_primary_keys gem。
但是,由于meta_shop_source始终为0,这似乎是浪费空间。稍后将对产品使用相同的过程,并且有数百万行,因此需要进行优化。
所以我正在寻找像belongs_to:meta_shop,class_name“Shop”,foreign_key:[0,:meta_shop_id]或我可以覆盖的方法,以便我不需要数据库中的meta_shop_source列。
答案 0 :(得分:0)
另一种方法是在模型中定义值,以便您可以直接从控制器直接访问它。
但是对于表中的未定义列,可以使用attr_accessor
,因为您不希望直接存储在数据库中,并且只存在于对象的生命周期中。
attr_accessor :source
如果meta_shop_source
始终为0,则无需在表中创建包含此字段的列。
只需使用外国主键meta_shop_id
。
同样,商店的主键应为id
。
这样,你永远不必担心来源,因为它总是0。
您可以在模型中定义值,以便您可以直接访问它。
更新:
就优化而言,通过添加以下索引在迁移级别执行:
必要时add_index
。仅仅因为一个源为0而消除一列不是一个好主意,并且不会影响性能。如果所有源的值都大于0,则可能这样做。
由于您有一个独特的“源”字段,因此可以创建索引。通过创建索引,您基本上可以创建一个内部寄存器,由MySQL本身保存。
ALTER TABLE shop ADD INDEX (source);
在创建和设置索引之后,只要您希望获取与已分配源5的个人有关的某些信息,服务就会通过使用索引直接转到它,从而生成结果比之前的查询快得多。