Я работаю над проектом, где существует несколько типов пользователей (студенты и учителя). В настоящее время, чтобы хранить информацию пользователя, две таблицы используются. users
таблица хранит информацию, которую имеют общего все пользователи. teachers
таблица хранит информацию, которую только учителя имеют с внешним ключом, связывающим ее с users
таблица.
users
таблица
teachers
таблица
В остальной части базы данных нет никаких ссылок на teachers.id
. Все другие таблицы, кто должен коснуться пользовательского использования users.id
. Так как у пользователя только будет одна соответствующая запись в таблице учителей, я должен просто переместить поля от таблицы учителей в пользовательскую таблицу и оставить их незаполненный для пользователей, которые не являются учителями?
например.
users
Это - слишком много полей для одной таблицы? Это будет препятствовать производительности?
Я думаю, что этот дизайн хорош, если предположить, что большую часть времени вам нужны только данные пользователя
, и что вы знаете, когда вам нужно показать учителю
-специфические поля.
Кроме того, вы получаете только учителей, просто выполнив JOIN
, что может пригодиться.
Завтра у вас может быть другой тип пользователя, который не будет учителем, и вы будете рады разлуке.
Отредактировано для добавления: да, это образец наследования, но поскольку он не сказал, на каком языке он говорит, я не хотел мутить воду ...
это не сильно повлияет на производительность, но другие программисты могут обидеться на вас, если вы не переделаете это :) (55 полевых таблиц ??)
Это не слишком много полей для одной таблицы (хотя без подробностей это выглядит подозрительно). И беспокоиться о производительности на данном этапе преждевременно.
Вероятно, вы имеете дело с очень небольшим количеством строк и очень небольшим объемом данных. Вы должны заботиться о 1) выполнении работы 2) ее правильном проектировании 3) производительности в указанном порядке.
Это действительно не так уж важно (на данном этапе / масштабе).
В остальной части базы данных нет ссылок на Teacher.id. Все остальные таблицы, которые должны относиться к пользователю используйте users.id.
Я бы ожидал, что это будет иметь отношение к идентификатору учителя для классов / разделов ...
Поскольку у пользователя будет только одна соответствующая запись в таблице учителей, я должен просто переместить поля из таблицы учителей в таблицу пользователей и оставить они пустые для пользователей, не являющихся учителями?
Вы моделируете систему для средней школы или послесреднего образования? Причина, по которой я спрашиваю, заключается в том, что в высшем учебном заведении пользователь может быть и учителем, и учеником ... по многим предметам.
Я думаю, это нормально, если ни вы, ни кто-либо другой не поддадитесь искушению повторно использовать «пустые» столбцы для других целей.
Под этим я подразумеваю, что в вашей новой таблице будут столбцы, которые будут заполнены только для учителей. Кто-то может решить, что есть другое значение, которое им нужно сохранить для не учителей, и использовать один из столбцов учителя для его хранения, потому что в конце концов оно никогда не понадобится для этого не учителя, и таким образом мы не нужно изменить таблицу, и довольно скоро ваш код заполнится вещами, тестирующими типы строк, чтобы определить, что содержит каждый столбец.
Я видел, как это делалось в нескольких системах (например, при предоставлении библиотечной книги во временное пользование, если ссуда представляет собой долгую ссуду, в сроке погашения указывается дата, когда книга должна быть получена обратно. Но если это краткосрочная ссуда, срок погашения удерживает ожидаемое время назад, и горе тому, кто этого не знает).
Я бы не стал помещать все поля в одну таблицу. Соотношение учеников и учителей велико, поэтому на 100 учителей может быть 10000 учеников с NULL в этих 17 полях. Обычно модель выглядит примерно так:
В вашем случае нет специальных полей для студентов, поэтому вы можете опустить таблицу Student
, поэтому модель будет выглядеть так
Примечание что для моделирования наследования таблица Teacher
имеет UserID
, то же самое, что и таблица User
; Сравните это с вашим примером, который имеет Id
для таблицы Teacher
, а затем отдельный user_id
.