【问题标题】:Foreign key as Primary key外键作为主键
【发布时间】:2011-07-05 04:40:39
【问题描述】:

我设计了这样的表格:

表1:学生 --------------------- PK 编号 姓名 数字 ... --------------------- 表 2:students_score --------------------- PK FK student_id 数学分数 英语分数 ... ---------------------

问题 1

如果有些学生根本没有分数,是不是很好的表格设计?

问题 2

如果它的设计很好,那么我如何在 MySQL 中将 FK 作为 PK?我不知道怎么做。每次我尝试像上面那样建立关系时,SQLYog 都会说这个错误:Can't create table 'students.#sql-a31_2c8e' (errno: 150)

谢谢

更新

我找到了问题 2from here 的答案。这只是类型(int,signed int)的问题。

【问题讨论】:

  • 啊。数据库设计。我认为最新的做法是对数据进行非规范化。学者们当然会在这里要求第五范式。
  • 速度与灵活性的对比。

标签: mysql database-design foreign-keys primary-key sqlyog


【解决方案1】:

我会建议更多类似的内容:

table1: students
---------------------
PK id
name
number
...
---------------------

table3: classes
---------------------
pk id
name

table2: students_score
---------------------
fk student_id
fk class_id
score
PK(student_id, class_id)

【讨论】:

    【解决方案2】:

    请改用UNIQUEFOREIGN KEY。它将允许您将FOREIGN KEY 与您的students_score 表一起使用,并将student_id 列保持为唯一。

    【讨论】:

      【解决方案3】:

      如果有些学生根本没有分数,是不是很好的表格设计?

      不,如果某些学生没有分数,students_score 表中不会有(或不应该有)记录。不过,这不是一个好的设计,这就是您会出错的原因。

      您的设计应该类似于:

      students
      ---------------------
      PK id
      name
      number
      
      students_score
      ---------------------
      FK student_id
      math_score
      english_score
      ...
      

      考虑在 students_score 表上为您的 student_id 创建一个 UNIQUE 索引,但这会将每个学生的记录数限制为一条,这可能不是您想要的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-06-29
        • 2016-05-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-03-10
        相关资源
        最近更新 更多