在设计关系数据库的过程中,如果我所做的设计变得更容易,那么我的脑子里就有了这个问题。 该设计包括4个表:(简化)
PK =主键, FK =外键
让我们说我们想获得有关位置的详细信息。如果地点是学校,我们希望看到学校的名称,学生数量和学校组的名称。如果是办公室,我们只想看到办公室的名称。 使用当前的设计,这在1个查询中是不可能的(据我所知)。
问题: 是否有更好的方法来设计此数据库,以便我可以在1个查询中获取有关位置的所需详细信息。
虽然可能有办法在1个查询中获取这些细节,但我更感兴趣的是增强数据库设计。
提前致谢, Knarfi
答案:我终于找到了描述我的问题的术语:Polymorphic Association。特别是this question给了我一个很好的答案。
答案 0 :(得分:1)
您可以尝试这样的事情
SELECT location.*,school.*,office.*
FROM location
LEFT JOIN school ON school.locationID=location.locationID
LEFT JOIN office ON office.locationID=location.locationID
在结果中,如果有办公室,则学校字段将为NULL值,反之亦然。但是你必须在你的应用程序中检查它并在那里做出决定 - 数据库会向你发送所有数据。
答案 1 :(得分:1)
您可以将学校和办公室合并到一个实体,例如:具有以下属性的组织:
关于您的上一个问题:" 虽然可能有办法在1个查询中获取这些详细信息,但我更感兴趣的是增强数据库设计。"我必须说这不是一个设计问题,而是一个实施问题。请记住,根据您的实施需求改变您的设计是一种非常糟糕的做法......
在任何情况下,您都可以在两种情况下使用一个查询(您和我的)查看其他人的答案。 tIp:尝试使用视图......在这种情况下它们很有用。
答案 2 :(得分:1)
数据库设计并不限制location
同时与school
和office
相关联。 (可能是多个学校和/或多个办公室。)
有几种可能的方法来检索与location
相关的信息。
这是一种方法:
SELECT 'school' AS source
, s.name
, s.students
, g.name AS school_group_name
FROM location sl
JOIN school s
ON s.location_id = sl.id
LEFT
JOIN group_of_schools g
ON g.id = s.group_id
UNION ALL
SELECT 'office' AS source
, o.name
, NULL
, NULL
FROM location ol
JOIN office o
ON o.location_id = ol.id
如果您需要限制在一组特定位置,则需要在每个WHERE
上添加SELECT
条款。
如果要按特定顺序返回行,请添加ORDER BY
。