我有几张桌子:
- 在
product
-table 中,我有一个产品列表。 - 在
user
-table 中,我有一个用户列表。 - 在
group
-table 中,我有用户组。 - 在
group_member
-table 中,我已经链接group
和member
(多对多) - 在
user_product
-table 中,我已链接user
和product
(多对多) - 在
group_product
-table 中,我已链接group
和product
(多对多)
所以一个用户可以有很多产品,一个产品可以有很多用户。一个用户可以是多个组的成员,一个组可以有多个成员。一个组可以有很多产品,一个产品可以有很多组。换句话说,一个产品可以同时拥有组和用户。
我想问数据库的是:“列出一个给定user
可以访问的所有产品,或者通过user_product
-table 中的直接关系,或者通过用户所属的组。我想要产品的名称和用户名。”
这是我提出的查询:
# 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 个产品,这会是一个快速查询吗?这是一个好的数据库设计,还是以另一种方式存储这个逻辑更好?
(这是我的第一个更复杂的查询。)