【问题标题】:Is the following acceptable foreign key usage以下是可接受的外键用法吗
【发布时间】:2012-04-18 10:48:33
【问题描述】:

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

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

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

【问题讨论】:

    标签: sql database-design


    【解决方案1】:

    我可能不会将userid 用作varchar。我也会把它作为int

    所以用户表是这样的:

    userId int
    userName varchar
    firstName varchar
    lastName varchar
    

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

    userId int
    result varchar
    id int
    examid INT
    

    因为如果您同时使用JOIN 将表格放在一起,那么JOIN 使用varchar 不如JOIN 使用INT

    编辑

    这取决于您计划存储多少数据。因为您知道GUIDs 至少有一个不是唯一的通道。 Simple proof that GUID is not unique。我想如果我要设计这个数据库,我会选择一个 int。因为使用 GUID 作为用户 ID 感觉有点矫枉过正

    【讨论】:

    • 我实际上是在考虑使用 GUID 作为用户的主键,而不是 int。这是个坏主意吗?
    • @david99world :记得给你认为好的答案投票。这给我们所有人一种温暖的模糊感觉:P
    【解决方案2】:

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

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

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

    【讨论】:

    • 我还建议将结果表中的考试外键字段重命名为“examid”以保持命名一致。
    【解决方案3】:

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

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

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

    【讨论】:

      【解决方案4】:

      在真正规范化您的架构之前,请确保您首先了解 Normal Forms

      【讨论】:

      • 嗯,好的,所以我应该将结果表中的值拆分为单独的表,以获得第一个范式。
      猜你喜欢
      • 1970-01-01
      • 2013-02-28
      • 1970-01-01
      • 2011-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多