2012-12-12 15 views
21

私は多対多の関係をモデリングしています。関係はほとんどの場合、一方の側からのみアクセスされます。それは、トップダウンでアクセスされ、逆の方法ではなく、階層に似ています。ジャンクションテーブルと外部キー配列

調査があり、持っていると多くのに属し回答多くの質問に属します。

両方のリレーションシップは多対多でなければなりません。同じ質問を異なるアンケートで再利用したり、多くの質問で同じ回答を使用できるためです。これは要件です。

M2Mの標準実装では、2つの接合テーブルsurveys_questionsquestions_answersが使用されます。代わりに、PostgreSQLの整数配列を使用して、調査にquestion_ids、質問にanswer_idsを格納することを考えています。

ANY演算子を使用して、外部キー配列に一致するすべての行を照会することができます。

SQLを使用して質問と質問の回答を含むすべてのアンケートをどのようにクエリしますか?

外部キー配列で返される行の順序をどのように一致させることができますか?すなわち、 question_ids = [1,2,3]を使用すると、1、2、3の順番で質問行が返されます。

これは、ジャンクションテーブルと比較してパフォーマンスがどのように優れていますか?

あなたはこれを提案しますか?このようなM2Mのモデリングに関するいくつかのリソースはありますか?

更新

ありのPostgreSQL 9.3に配列外部キーの参照整合性を追加するための提案があったが、それは含まれていませんでした:http://blog.2ndquadrant.com/postgresql-9-3-development-array-element-foreign-keys/

外部キー配列を使用して秩序を維持に関するSOの質問はPostgreSQL JOIN with array type with array elements order, how to implement?

+0

あなたは多対多と言っていますが、これは1対多のように聞こえます。多くの場合、各調査はいくつかの質問に関連しており、各質問はいくつかの調査に関連していますが、少し奇妙に聞こえるのは確かです。 -Manyは通常「has-and-belong-to-many」と呼ばれます) – SingleNegationElimination

+0

@TokenMacGuy:混乱して申し訳ありません。質問は調査を通してクロスラップし、多対多の関係を作る質問にも答えます。私はHABTMと多くの関係を持っています。 – randomguy

答えて

7

接合テーブル手法を使用します。配列メソッドは、それがどれほど効果があるのか​​について質問する必要があるだけでなく、もう一方は完全に標準です。

+4

ジャンクションテーブルは配列よりもかなり遅くなる可能性があります。 https://gist.github.com/joevandyk/031cf5812bd656887623 –

+0

はい、場合によっては、配列メソッドから得られるパフォーマンスの向上があります。もちろん、すべての状況に耐えるかどうかという大きな疑問があります。主な問題の1つは、新しいリンクを追加/削除するには、挿入/削除ではなく、長い行(例ではクーポン)クーポン・テーブルのロックが含まれています。 –

+0

合意!すべての挿入時にクーポン表を変更したくない場合は、代わりにcoupons_products_array表(coupon_id、product_ids [])を使用できます。しかし、それはばかげているかもしれません。 –