数据库设计需要帮助

时间:2010-07-19 13:42:46

标签: sql mysql oracle erd

设计数据库以存储有关美国总统及其任期的详细信息。此外,记录他们的日期和出生地点,性别和政党关系的详细信息。你需要记录总统的顺序,以便确定任何总统的前任和继任者。请记住格罗弗克利夫兰提供两个不连续的条款,政治背景可以改变。

这是我到目前为止让我知道是否可以改进。我怎么能这样做“任何总统的前任和继任者都可以被识别”这是使用递归关系完成的,我将如何执行?

Table President       Table Origin

PK presID            PK orID    
   presFName            orCity
   presLName            orState
   affiliation          birthDate
   gender
   term

4 个答案:

答案 0 :(得分:5)

嗯,在这种情况下你有两个实体(表):总统和条款。条款将记录该期限的日期和现任主席。

总统表将记录总统的详细信息,不包括条款,因为条款表中对此进行了描述。

了解这一点,您可以自己回答问题。以下是一些线索:

确定前任和继任者。这将按日期完成,因此您知道前任是您现在正在查看的前一个上一个日期,后继将是之后的直接日期。请注意,您所看到的总统(第一任总统和现任总统)可能并不总是存在前任和继任者。

您想查看ORDER BY [DATE]和SELECT TOP ...

从技术上讲,设计可以进一步为出生地创建第三个表,但这是语义。

你目前的想法将名词列入总统名单 - 这不包括任命第二任期的总统。但是,您可以使用两列 - 但数据的标准化将向您显示条款可能是一个单独的表(但是,设计参数表示每个只有两个术语,因此它的摆动和环形交替)。

实际上,很多关于总统的数据可以使用规范化规则扩展到其他表中 - 但我暂时不会放弃......

如果您有任何具体问题,请在评论中提问 - 我一直是间接的,因为它的功课:)

答案 1 :(得分:1)

在尝试设计数据库时,我采取的第一步是尝试识别实体及其关系。根据我的经验,这样做的最好方法是通过要求(在你的情况下的家庭作业问题)并开始列出名词。每个人都是潜在的实体。在这种情况下,我看到:

总统 办公室条款 政治党派 序列

我看到的关系是总统有一个或多个任期,并且可以有一个或多个政党关系(并且一个政党可以有一个或多个与其有联系的总统 - 所以这将是多对多的关系。)

经过进一步审查,在我看来,序列是更多的派生信息。出生地和出生日期看起来更像是总统的属性而不是实际的实体,尽管你可以把“地方”变成自己的实体。所以,我开始为Presidents,Terms,Political_Parties以及城市,州等制定表格。

完成后,我开始查看每个实体的属性要求。总统有出生日期,出生地和性别。

现在添加实体之间的关系,这可能涉及在某些情况下添加一个简单列,这是另一个实体的外键,或者可能涉及添加一个连接到实体的全新表。

对于条款,我会坚持开始和结束日期。我建议反对任何“术语ID”。您始终可以通过简单的SQL查询找到日期中的术语编号。

答案 2 :(得分:1)

答案 3 :(得分:0)

嗯,为了将总统与他们的起源联系起来,你需要带上你的身份 presID
作为Table Origin中的外键

然而,你可能会更好地创建一个tbl_term,因为有很多总统都有一个以上的任期。上面的例子要求你有多个总统条目用于多个术语。

tbl_term
PK term_id
FK pres_id
期限

检索前任/后继人员 DECLARE @maxTerm INT
DECLARE @minTerm INT

SELECT @maxTerm = MAX(term_id), @minTerm = MIN(term_id) FROM tbl_term AS t
JOIN tbl_pres AS p
ON p.pres_id = t.pres_id
WHERE p.presLName = 'lname'
AND p.presFName = 'fname'

然后前任是 SELECT p.presLName, p.presFName FROM tbl_pres AS p
JOIN tbl_term AS t
ON p.pres_id = t.pres_id
WHERE t.term_id = @minTerm - 1

反之亦然 SELECT p.presLName, p.presFName FROM tbl_pres AS p
JOIN tbl_term AS t
ON p.pres_id = t.pres_id
WHERE t.term_id = @maxTerm + 1