3

(悪い英語でごめんなさい)

モデルA、B、Cがあるとします。各モデルには1つのアドレスがあります。

「SQLアンチパターン:データベースプログラミングの落とし穴の回避」(第7章-ポリモーフィックアソシエーション)には、「共通スーパーテーブル」(ベーステーブルまたは祖先テーブルとも呼ばれます)を使用してこのようなアソシエーションを回避するレシピがあります。

多形的には、次のようになります。

table addresses:
    id: integer
    parent_type:string  # 'A', 'B' or 'C'
    parent_id: integer

交差テーブルを使用できることは知っていますが、次のソリューションはより洗練されているように見えます。

A、B、CをAddressに多態的に関連付ける代わりに、レシピでは、idフィールド(代理キーまたは疑似キー)のみを持つスーパーテーブル(Addressing)を作成することを提案しています。次に、他のテーブルはアドレス指定を参照します。そうすれば、「外部キーによるデータベースのデータ整合性の強制に頼ることができます」と著者は言います。したがって、次のようになります。

table addressing
    id: integer
table addresses
    id: integer
    addressing_id: integer  (foreign_key)
    zip: string
table a
    id: integer
    addressing_id: integer  (foreign_key)
    name: string
table b
    id: integer
    addressing_id: integer  (foreign_key)
    name: string
table c
    id: integer
    addressing_id: integer  (foreign_key)
    name: string

SQLクエリは次のようになります。

SELECT * from a
  JOIN address USING addressing_id
  WHERE a.addressing_id = 1243 

質問は次のとおりです。Railsでそのようなシナリオをコーディングする方法は?私はいくつかの方法で試みましたが成功しませんでした。

4

1 に答える 1

1

オブジェクト A、B、C はそれぞれ単一のアドレスを持っていますか? または多くのアドレス?以下のコメントから、各オブジェクトに 1 つのアドレスがあるように見えます。

すべてのオブジェクトにアドレスが 1 つしかない場合は、アドレス ID を使用して A/B/C オブジェクトに外部キーを配置するだけです。House オブジェクトまたは Office オブジェクトに 1 つの住所があるとします。

class House < ActiveRecord::Base
  belongs_to :address
end

class Office < ActiveRecord::Base
  belongs_to :address
end

offices およびhousesDB テーブルには外部キー address_id が必要です。house.addressこのようにして、またはのようなものでオブジェクトのアドレスにアクセスできますoffice.address

これらのオブジェクトが多くのアドレスを持つ可能性がある場合、解決策は A/B/C オブジェクトによって異なります。それらが関連している場合は、Single Table Inheritance を使用できます。Rails はこのパターンを十分にサポートしていますが、詳細情報がなければ、どちらが最善のアプローチであるかを判断するのは困難です。

于 2012-03-10T00:08:40.133 に答える