如何规范化此数据库设计?

时间:2009-08-10 17:20:13

标签: database-design normalization database-agnostic

我正在为客户创建一个划船报告和统计系统,我现在的结构类似于以下内容:

-----------------------------------------------------------------------------
| ID | Team     | Coaches    | Rowers     | Event     | Position | Time     |
-----------------------------------------------------------------------------
| 18 | TeamName | CoachName1 | RowerName1 | EventName | 1        | 01:32:34 |
|    |          | CoachName2 | RowerName2 |           |          |          |
|    |          |            | RowerName3 |           |          |          |
|    |          |            | RowerName4 |           |          |          |
-----------------------------------------------------------------------------

这是一个示例行数据,但我想将其扩展为Rowers表和Coaches表等,但我不知道如何最好将其链接回Entries表,这就是这个

有人有任何可以与我分享的智慧之词吗?

更新

一支球队可以拥有任意数量的教练和划船者,一支Rower可以在很多球队(A队,B队,C队等),一支球队可以有很多教练。

5 个答案:

答案 0 :(得分:2)

我会为球队,教练员,赛艇运动员(如果有多种类型的运动可能需要扩展到运动员)和活动分别使用表格。

TeamID

教练

CoachID

赛艇

RowerID

活动

的EventID TeamID RowerID

还有很多其他问题可以进一步定义关系,例如:什么定义了条目(事件)?是一套赛艇运动员和一个教练PER事件吗?每个赛事每组赛艇有多名教练?有团队吗?组成团队的原因是什么?

我会问这样的问题......

答案 1 :(得分:1)

  

一种链接表?然后,我如何将多个赛艇手和教练映射到一个团队?

这是我的建议(基于Optimal Solutions' answer):

<强>团队
TeamID
TeamName

<强>长途汽车
CoachID
CoachName

<强>赛艇
RowerID
RowerName

<强>事件
事件ID
位置
时间

  1. 如果您想要预定义的团队:
  2. CoachTeamLink CoachsTeams之间的链接)
    TeamID
    CoachID

    RowerTeamLink RowersTeams之间的链接)
    TeamID
    RowerID

    EventTeamLink EventsTeams之间的链接)
    TeamID
    EventID

    1. 或者如果你不这样做:
    2. EventCoachLink EventsCoachs之间的链接)
      事件ID
      CoachID

      EventRowerLink EventsRowers之间的链接)
      事件ID
      RowerID

答案 2 :(得分:0)

你说你发布的是“条目表”,但这个表格没有多大意义,最不是(一行,没有双关语)=(一个事实或事物)。

表中的一行是(NULL,NULL,NULL,RowerName3,NULL,NULL,NULL)。那是什么意思?教练CoachName2是什么?等等。

或者这可能是您的条目表的“一行”?如果是这样,那么它不是一个好的SQL表,因为你在一个行 - 列交集中有行(例如)列表,而“list-of-rowers”不是数据类型的好选择。

如果只查看一些数据,则无法说明如何规范化数据库。您需要知道数据在其建模的业务中的含义和代表。

那就是说,我觉得你至少需要单独的表格

队 教练 赛艇 事件

然后你需要代表业务场景的各个方面,例如“一个划船者只属于一个团队”,“一个团队至少有一个教练,没有教练教练多个团队。”

我不知道条目的内容是什么,但也许你需要一个条目表。也许如果我知道划船会更有意义。

答案 3 :(得分:0)

我会有以下表格:

团队:ID,TeamName 教练:ID,CoachName,TeamID Rower:ID,RowerName,TeamID

然后您的事件表将填充如下:

事件:ID,TeamID,CoachID,RowerID,EventName,位置,时间

如果要在查询中显示反规范化数据,可以构建如下内容:

SELECT E.ID, T.TeamName, C.CoachName, R.RowerName, E.EventName, E.Position, E.Time
FROM Event E
INNER JOIN Team T
ON E.TeamID = T.ID
INNER JOIN Coach C
ON E.CoachID = C.ID
INNER JOIN Rower R
ON E.RowerID = R.ID

答案 4 :(得分:0)

我会尝试这样的事情::

teams
  id
  name


rowers
  id
  name
  team_id REFERENCES TEAMS (id)

coaches
  id
  name
  team_id REFERENCES teams (id)

events
  id
  name
  starting_time
  length

event_teams
  event_id references events (id)
  team_id references teams (id)
  position