以下是可接受的外键使用方法

时间:2012-04-18 10:48:33

标签: sql database-design

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

user table

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

results table

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

enter image description here

4 个答案:

答案 0 :(得分:2)

我可能没有userid作为varchar。我也会将其作为int

所以用户表是这样的:

userId int
userName varchar
firstName varchar
lastName varchar

然后结果表中的forenkey将是int。像这样:

userId int
result varchar
id int
examid INT

如果你正在JOIN同桌,那么JOIN varchar JOIN的速度不会INT GUID GUID {{1}}

修改

这取决于您要存储的数据量。因为你知道{{1}}不是唯一的最小chans。 Simple proof that GUID is not unique。我想如果我设计这个数据库,我会选择一个int。因为使用{{1}}作为用户标识

,感觉有点过分

答案 1 :(得分:1)

如果每个用户/考试只生成一个结果,那么您可以使用结果表中的useridexam列创建复合键。

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

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

答案 2 :(得分:1)

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

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

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

答案 3 :(得分:1)

在实际规范化架构之前,请确保首先了解Normal Forms