0

我们有多个必须匹配的来自不同数据源的商店列表。

商店有一个复合主键 [source, id]。匹配会在源 = 0 的商店表中创建一个单独的条目,并提取可能因源而异的值(名称、url、...)。

现在我可以将另外两列 meta_shop_source 和 meta_shop_id 添加到 shop 和一个 belongs_to :meta_shop, class_name "Shop", foreign_key: [:meta_shop_source, :meta_shop_id] 到 Shop 模型。我正在使用composite_primary_keys gem。

但是,由于 meta_shop_source 始终为 0,这似乎是在浪费空间。稍后将相同的过程用于产品,并且有数百万行,因此需要进行优化。

所以我正在寻找类似 belongs_to :meta_shop, class_name "Shop", foreign_key: [0, :meta_shop_id] 之类的东西,或者我可以覆盖的方法,这样我就不需要数据库中的 meta_shop_source 列。

4

1 回答 1

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 的个人有关的一些信息时,服务将直接使用索引转到它,因此生成结果的速度要快得多速度比之前的查询。

于 2013-02-11T09:30:01.477 回答