私はいくつかのテーブルを持っています:
- テーブルには
product
、製品のリストがあります。 - -テーブルには、
user
ユーザーのリストがあります。 - -テーブルには、
group
ユーザーのグループがあります。 - -tableでは、 and (多対多) を
group_member
リンクしました。group
member
- -テーブルでは、and (多対多) を
user_product
リンクしましたuser
product
- -テーブルでは、and (多対多) を
group_product
リンクしましたgroup
product
したがって、ユーザーは多くの製品を持つことができ、製品は多くのユーザーを持つことができます。ユーザーは多くのグループのメンバーになることができ、グループは多くのメンバーを持つことができます。グループは多くの製品を持つことができ、製品は多くのグループを持つことができます。つまり、製品はグループとユーザーの両方を持つことができます。
私がデータベースに尋ねたいのは次user
のuser_product
とおりです。ユーザーの名前。」
これは私が思いついたクエリです:
# First get all the products the user has access to via a group.
SELECT product.name,
user.first_name
FROM product
INNER JOIN group_product
ON group_product.product_id = product.product_id
INNER JOIN group
ON group.group_id = group_product.group_id
INNER JOIN group_member
ON group_member.group_id = group.group_id
INNER JOIN user
ON user.user_id = group_member.user_id
WHERE user.user_id = 1
UNION
# Now get all the products via direct access from user_product.
SELECT product.name,
user.first_name
FROM product
INNER JOIN user_product
ON user_product.product_id = product.product_id
INNER JOIN user
ON user.user_id = user_product.user_id
WHERE user.user_id = 1
これは良いクエリですか、それともこれを JOIN のみのクエリに書き直す方が良い/可能ですか? 100,000 人のユーザー、10,000 のグループ、および 100 の製品がある場合、これは高速なクエリでしょうか? これは適切なデータベース設計ですか、それともこのロジックを別の方法で保存する方がよいでしょうか?
(これは私の最初のより複雑なクエリです。)