0

家族、親、子供、クラブの 4 つのテーブルがあります。家族には多くの親と多くの子供がいます。子供たちは多くのクラブ会員を持っています。

親と子のそれぞれ、名前、メールアドレス、および子供が所属するすべてのクラブのすべての ID のすべての配列を返す、名前とメールアドレスをすばやく検索するための「ビュー」を作成したいと思います。

ビューに表示したいクエリについて、これまでに持っているものは次のとおりです。

 SELECT
  families.id AS family_id,
  'Child' AS searchable_type,
  concat(children.first_name, ' ',children.last_name) AS term,
  '' AS email,
  array_agg(memberships.club_id) AS clubs
FROM children
INNER JOIN families ON children.family_id = families.id
LEFT JOIN memberships ON children.id = memberships.child_id
GROUP BY families.id, term, email

UNION

SELECT
  families.id AS family_id,
  'Parent' AS searchable_type,
  concat(parents.first_name, ' ',parents.last_name) AS term,
  parents.email AS email,
  array_agg(memberships.club_id) AS clubs

FROM parents
INNER JOIN families ON parents.family_id = families.id
INNER JOIN children ON families.id = children.family_id
LEFT JOIN memberships ON children.id = memberships.child_id
GROUP BY families.id, email, term

質問は次のとおりです。

  • 子供と親の重複する club_id を取り除くにはどうすればよいですか?
  • それは本当に遅いクエリです。インデックスが作成されている場合、子または親で書き込みが発生するたびにビューが更新されますか?

  • 実行計画は次のとおりです。 http://explain.depesz.com/s/BA9

  • ここにsqlfiddleがあります:http://sqlfiddle.com/#!15/9c737/2

4

1 に答える 1