Внешний ключ как первичный ключ

Я разработал такие таблицы:

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

table2: students_score
---------------------
PK FK student_id
math_score
english_score
...
---------------------

Вопрос 1

Если у некоторых учеников вообще нет оценок, это хороший дизайн таблицы?

Вопрос 2

Если это хороший дизайн, как я могу сделать FK как PK в MySQL? Я не могу понять, как это сделать. Каждый раз, когда я пытаюсь создать отношение, подобное приведенному выше, SQLYog сообщает об ошибке: Can't create table 'students.#sql-a31_2c8e' (errno: 150)

Спасибо

Обновить

Я нашел ответ на вопрос 2 отсюда. Это была проблема типа (int, signed int).


person Sanghyun Lee    schedule 05.07.2011    source источник
comment
аруг. база данных-дизайн. Я думаю, что последний шаг - денормализация данных. Ученые, конечно же, попросят здесь пятую нормальную форму.   -  person J-16 SDiZ    schedule 05.07.2011
comment
Все дело в скорости и гибкости.   -  person Kevin Stricker    schedule 05.07.2011


Ответы (3)


Я бы предложил нечто большее в этом роде:

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)
person Kevin Stricker    schedule 05.07.2011

Вместо этого используйте UNIQUE и FOREIGN KEY. Это позволит вам использовать FOREIGN KEY с вашей students_score таблицей и сохранить столбец student_id как уникальный.

person Brian Graham    schedule 05.07.2011

Если у некоторых учеников вообще нет оценок, это хороший дизайн таблицы?

Нет, если у некоторых студентов нет оценок, в таблице student_score не будет (или не должно быть) записей. Однако это плохой дизайн, и поэтому вы получаете ошибки.

Ваш дизайн должен быть похож на:

students
---------------------
PK id
name
number

students_score
---------------------
FK student_id
math_score
english_score
...

Подумайте о создании UNIQUE индекса для вашего student_id в таблице students_score, но это ограничит ваше количество записей на одного учащегося до одной, что, возможно, не то, что вам нужно.

person james_bond    schedule 05.07.2011