数据库设计概念:当我使用两个或多个外键时,是否需要使用主键?

时间:2014-05-16 23:54:19

标签: database-design

我不确定我是否在这里做事:

1)可以在一个表中输入所有用户信息(姓名,姓氏,邮件,密码,城市和州)吗?

2)城市与州有什么关系?

3)用户能够为一个主题,级别,一个州,一个城市和一个日期创建挑战。 (single_challenge表)。一个或多个用户可以注册此挑战(registration_sc)。当我使用两个或更多外键时,是否需要在“single_challenge”表上设置主键?这个设计是否合适?

4)如果我想允许用户创建锦标赛挑战(与single_challenge表相同),但还有两个选项:“最大铭文”和“结束日期”。我应该创建另一个名为“tournament_challenge”的表,或者我可以将这两个字段添加到“single_challenge”表中?

enter image description here

2 个答案:

答案 0 :(得分:0)

1)是的,可以将所有信息都放在用户表中。

2)是的,一对多的关系是正确的方式。

3)你总是需要一把主键。您可以使用两个外键来复合键,如果这是您想要的,但这通常用于中间表。在使用MySQL Workbench的组合键中,外键也必须标记为主键。使用“Ctrl”键选择两个外键,然后设置为主键。

4)这两种情况都有可能,但最好为锦标赛创建一个单独的表格。

答案 1 :(得分:0)

我认为设计决定是半工程师问题和半艺术家问题。有些事情可以被标记为不良做法,但许多其他因素取决于许多因素,并与“应用领域”现实相关联。对我来说,你的问题属于这一类:

1)有一件坏事:您应该只保留城市ID,而不是州ID,因为州ID来自城市ID(可以从城市ID中检索) 如果您已经确定用户无法拥有多个地址,那么其余的似乎没问题。

2)我认为没关系。一个城市属于一个国家,一个国家拥有几个城市(一对多关系)

3)在这里,你应该删除状态ID,因为城市ID就足够了。 id_user很好,但您也可以将其删除并使用指向注册顺序的属性限定关系(registrations_sc)。然后,挑战的第一个注册用户将是其创建者。

关于主键:是否有多个外键不相关。您需要知道的是,某些字段的组合是否唯一地确定了整行。这是一个候选键。如果用户只能在给定级别的城市中针对单个日期中的一个主题发出挑战,则{user_id,city_id,level_id,subject_id,date}是候选键,并且您不需要另一个主键。无论如何,出于性能和简单性的原因,您可能(并且可能应该)仍然决定拥有自己的自主数字单字段主键。在这种情况下,您不应忘记在候选键的字段组合上定义唯一索引,因此您不能插入重复项。

4)同样,您可以选择一条路径或另一条路径。有几种方法可以实现它。您可以将这些字段添加到表中,并为单个挑战保留为空。您可以使用不同的表。您还可以对两者使用single_challenge表,并创建另一个表以保持“最大铭文”和“结束日期”,以及“single_challenge”的外键。此表仅适用于锦标赛的挑战。您必须知道如何利用模型,并设计一个实现: 1)技术上是否正确(但可能很多) 2)AND也很实用,让你的生活更轻松(简化你的查询,插入,删除等)。

我希望它可以提供帮助。