2

我有以下数据库,第一个表 users 是包含我的用户的表,userid 是主键。

用户表

接下来是我的结果表,现在对于每个用户,可以有一个带有 id 的结果,并且可以针对考试。在这种情况下使用“id”作为主键和“userid”作为外键是否可以?有没有更好的方法可以模拟这种情况?

结果表

然后这些链接到相应的考试......

在此处输入图像描述

4

4 回答 4

2

我可能不会有userid一个varchar. 我也会这样int

所以用户表是这样的:

userId int
userName varchar
firstName varchar
lastName varchar

然后结果表中的前键将是int. 像这样:

userId int
result varchar
id int
examid INT

因为如果你JOIN把桌子放在一起,那么在 a 上 ingJOIN不如varcharJOINa 上快INT

编辑

这取决于您计划存储多少数据。因为你知道有一个GUIDs 不是唯一的最小通道。GUID 不是唯一的简单证明。我想如果我要设计这个数据库,我会选择一个 int。GUID因为使用 a作为用户 ID感觉有点矫枉过正

于 2012-04-18T10:55:41.547 回答
1

假设每个用户/考试只会产生一个结果,那么您可以使用结果表中的useridandexam列创建一个复合键。

不过就个人而言,我会采用任意id字段方法,因为我不喜欢将多个值传递给参考记录。但这只是我:)。

此外,exam结果表中的字段也应该是外键。

于 2012-04-18T10:55:18.180 回答
1

另一种方法是从考试中抽象出成绩等级,并使考试成为其自己表上的唯一实体(和主键)。因此,这将创建一个等级表(pkey1 = A、pkey2 = B 等),其中等级充当第二个表中的外键,从而删除整个字段。

您还可以规范化另一个级别并为主题制作一个表,这将是专用考试代码表的外键。您可以使用 ENG101、ENG102 等进行考试,对于该科目的其他考试代码也是如此。这样做的好处是将您的考试、科目、学生和年级水平保持为独特的实体。每个的主键和外键都很明显,您可以保持简单的维护未来并有扩展空间。

您可以考虑使用复合键,但这是一种很好且简单的开始方式,您可以根据需要合并表以进行索引和压缩。

于 2012-04-18T11:12:08.110 回答
1

请确保您首先了解范式,然后才能真正规范化您的架构。

于 2012-04-18T11:45:40.120 回答