0

一致する必要があるさまざまなデータ ソースからのショップの複数のリストがあります。

ショップには複合主キー [source, id] があります。照合により、shops テーブルに source=0 の別のエントリが作成され、ソースごとに少し異なる可能性がある値 (名前、URL など) が抽出されます。

これで、別の 2 つの列 meta_shop_source と meta_shop_id をshops に追加し、belongs_to :meta_shop, class_name "Shop",foreign_key: [:meta_shop_source, :meta_shop_id] を Shop モデルに追加できます。私はcomposite_primary_keys gemを使用しています。

ただし、me​​ta_shop_source は常に 0 であるため、スペースの無駄に思えます。同じプロセスが後で製品に使用され、数百万行あるため、最適化が必要になります。

そのため、begs_to :meta_shop, class_name "Shop",foreign_key: [0, :meta_shop_id] のようなもの、またはデータベースに meta_shop_source 列が必要ないようにオーバーライドできるメソッドを探しています。

4

1 に答える 1

0

1 つの代替方法は、コントローラーから直接アクセスできるように、モデルで値を定義することです。

ただし、テーブル内の未定義の列についてattr_accessorは、データベースに直接格納したくないため使用でき、オブジェクトの存続期間中のみ存在します。

attr_accessor :source

が常に 0 である場合meta_shop_source、テーブルにこのフィールドを含む列を作成する必要はありません。

外部の主キーを使用するだけmeta_shop_idです。

同様に、Shop の主キーは である必要がありますid

そうすることで、ソースは常に 0 になるため、心配する必要はありません。

モデルに値を定義して、直接アクセスできるようにすることができます。

アップデート:

最適化に関する限り、必要に応じて次のようにインデックスを追加して、移行レベルで実行します add_index。1 つのソースが 0 であるという理由だけで 1 つの列を削除することはお勧めできず、パフォーマンスには影響しません。これは、すべてのソースの値が 0 より大きい場合に発生する可能性があります。

個別の「ソース」フィールドがあるため、インデックスを作成できます。インデックスを作成すると、基本的に MySQL 自体によって保存される内部レジスタが作成されます。

ALTER TABLE shop ADD INDEX (source);

インデックスを作成して設定すると、後でソース 5 が割り当てられた個人に関する情報を取得したいときはいつでも、サービスはインデックスを使用してすぐにそれにアクセスするため、はるかに高速に結果を生成します。以前のクエリよりもペース。

于 2013-02-11T09:30:01.477 に答える