1

设计一个数据库来存储有关美国总统及其任期的详细信息。此外,记录他们的出生日期和地点、性别和政党隶属关系的详细信息。您需要记录总统的顺序,以便可以识别任何总统的前任和继任者。请记住,格罗弗·克利夫兰曾两次连续任职,政治派别可能会发生变化。

到目前为止,如果可以改进,请告诉我。还有我怎么能做到这一点“可以识别任何总统的前任和继任者”这是使用递归关系完成的,我将如何执行这个?

Table President       Table Origin

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

4 回答 4

5

好吧,在这种情况下,您有两个实体(表):总裁和条款。条款将记录任期的日期和现任主席。

总统表将记录总统的详细信息,不包括条款,因为这在条款表中有所涵盖。

知道了这一点,您就可以自己回答问题了。这里有一些线索:

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

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

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

您当前的想法将任期放入总统表中-这不包括连任的总统。但是,您可以使用两列 - 但数据的规范化会告诉您术语可能是一个单独的表(但是,设计论点说每个只有两个术语,因此它的摆动和回旋处)。

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

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

于 2010-07-19T14:00:30.740 回答
1

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

总统 任期 政党 顺序

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

经过进一步审查,在我看来,该序列是更多衍生信息。出生地和出生日期看起来更像是总统的属性,而不是实际实体,尽管您可以将“地方”变成它自己的实体。所以,我会开始为总统、任期、政治党派,也许还有城市、州等列出表格。

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

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

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

于 2010-07-19T14:29:43.813 回答
1

ERD 图片 http://michaelquiles.homeserver.com/notes/sites/default/files/images/Capture.PNG

这看起来正确吗?

于 2010-07-19T17:39:58.237 回答
0

好吧,为了将总统与他们的出身联系起来,您需要将您的
presID
As a foreign key 带入 Table Origin

然而,创建一个 tbl_term 可能会更好,因为有许多总统不止一个任期。上面的示例需要您为多个任期提供多个总统条目。

tbl_term
PK term_id
FK pres_id
term

检索前任/继任者
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

于 2010-07-19T13:56:30.273 回答