关系数据库设计问题

时间:2015-04-27 20:14:53

标签: mysql database relational-database relation

在设计关系数据库的过程中,如果我所做的设计变得更容易,那么我的脑子里就有了这个问题。 该设计包括4个表:(简化)

  • 位置
  • 办公室
  • 学校小组

ERD PK =主键, FK =外键

让我们说我们想获得有关位置的详细信息。如果地点是学校,我们希望看到学校的名称,学生数量和学校组的名称。如果是办公室,我们只想看到办公室的名称。 使用当前的设计,这在1个查询中是不可能的(据我所知)。

问题: 是否有更好的方法来设计此数据库,以便我可以在1个查询中获取有关位置的所需详细信息。

虽然可能有办法在1个查询中获取这些细节,但我更感兴趣的是增强数据库设计。

提前致谢, Knarfi

答案:我终于找到了描述我的问题的术语:Polymorphic Association。特别是this question给了我一个很好的答案。

3 个答案:

答案 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)

您可以将学校和办公室合并到一个实体,例如:具有以下属性的组织:

  • Organization_ID(PM)
  • 类型(1 =学校,2 =办公室)
  • Location_ID(FK)
  • Group_ID(FK)(它只能为学校提供值,除非您想要为办公室添加组信息,例如:表组中的会计,销售等)
  • 名称
  • NumOfMembers (它可以应用于学校和办公室)

关于您的上一个问题:" 虽然可能有办法在1个查询中获取这些详细信息,但我更感兴趣的是增强数据库设计。"我必须说这不是一个设计问题,而是一个实施问题。请记住,根据您的实施需求改变您的设计是一种非常糟糕的做法......

在任何情况下,您都可以在两种情况下使用一个查询(您和我的)查看其他人的答案。 tIp:尝试使用视图......在这种情况下它们很有用。

答案 2 :(得分:1)

数据库设计并不限制location同时与schooloffice相关联。 (可能是多个学校和/或多个办公室。)

有几种可能的方法来检索与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