我有以下数据库,第一个表用户是包含我的用户的表,userid是主键。
接下来是我的结果表,现在对于每个用户,可能会有一个带有ID的结果,它可能会违反考试。在这种情况下,使用“id”作为主键并将“userid”用作外键是否可以?有没有更好的方法来模拟这种情况?
然后链接到相应的考试...
答案 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)
如果每个用户/考试只生成一个结果,那么您可以使用结果表中的userid
和exam
列创建复合键。
就个人而言,我会采用任意id
字段方法,因为我不喜欢将几个值传递给引用记录。但那只是我:)。
此外,结果表中的exam
字段也应该是外键。
答案 2 :(得分:1)
另一种方法是从考试中抽象成绩水平,并使考试成为自己桌面上的唯一实体(和主键)。因此,这将生成Grade Levels表(pkey1 = A,pkey2 = B等),其中等级充当第二个表中的外键,从而删除整个字段。
您还可以正常退出另一个级别并为Subjects创建一个表,这将是专用的Exam Code表的外键。您可以使用ENG101,ENG102等进行考试,对于该科目的其他考试代码也是如此。这样做的好处是将您的考试,科目,学生和年级保持为独特的实体。每个主键和外键都很明显,您可以保持简单的维护未来,并有扩展空间。
您可以考虑使用复合键,但这是一种很好且简单的启动方式,您可以根据需要合并表以进行索引和压缩。
答案 3 :(得分:1)
在实际规范化架构之前,请确保首先了解Normal Forms。