Добавление новых полей по сравнению с составлением отдельной таблицы

Я работаю над проектом, где существует несколько типов пользователей (студенты и учителя). В настоящее время, чтобы хранить информацию пользователя, две таблицы используются. users таблица хранит информацию, которую имеют общего все пользователи. teachers таблица хранит информацию, которую только учителя имеют с внешним ключом, связывающим ее с users таблица.

users таблица

  • идентификатор
  • имя:
  • электронная почта
  • 34 других поля

teachers таблица

  • идентификатор
  • user_id
  • тема:
  • 17 других полей

В остальной части базы данных нет никаких ссылок на teachers.id. Все другие таблицы, кто должен коснуться пользовательского использования users.id. Так как у пользователя только будет одна соответствующая запись в таблице учителей, я должен просто переместить поля от таблицы учителей в пользовательскую таблицу и оставить их незаполненный для пользователей, которые не являются учителями?

например.

users

  • идентификатор
  • имя:
  • электронная почта
  • тема:
  • 51 другое поле

Это - слишком много полей для одной таблицы? Это будет препятствовать производительности?

6
задан egrunin 3 July 2010 в 18:31
поделиться

6 ответов

Я думаю, что этот дизайн хорош, если предположить, что большую часть времени вам нужны только данные пользователя , и что вы знаете, когда вам нужно показать учителю -специфические поля.

Кроме того, вы получаете только учителей, просто выполнив JOIN , что может пригодиться.

Завтра у вас может быть другой тип пользователя, который не будет учителем, и вы будете рады разлуке.

Отредактировано для добавления: да, это образец наследования, но поскольку он не сказал, на каком языке он говорит, я не хотел мутить воду ...

2
ответ дан 17 December 2019 в 22:10
поделиться

это не сильно повлияет на производительность, но другие программисты могут обидеться на вас, если вы не переделаете это :) (55 полевых таблиц ??)

-1
ответ дан 17 December 2019 в 22:10
поделиться

Это не слишком много полей для одной таблицы (хотя без подробностей это выглядит подозрительно). И беспокоиться о производительности на данном этапе преждевременно.

Вероятно, вы имеете дело с очень небольшим количеством строк и очень небольшим объемом данных. Вы должны заботиться о 1) выполнении работы 2) ее правильном проектировании 3) производительности в указанном порядке.

Это действительно не так уж важно (на данном этапе / масштабе).

0
ответ дан 17 December 2019 в 22:10
поделиться

В остальной части базы данных нет ссылок на Teacher.id. Все остальные таблицы, которые должны относиться к пользователю используйте users.id.

Я бы ожидал, что это будет иметь отношение к идентификатору учителя для классов / разделов ...

Поскольку у пользователя будет только одна соответствующая запись в таблице учителей, я должен просто переместить поля из таблицы учителей в таблицу пользователей и оставить они пустые для пользователей, не являющихся учителями?

Вы моделируете систему для средней школы или послесреднего образования? Причина, по которой я спрашиваю, заключается в том, что в высшем учебном заведении пользователь может быть и учителем, и учеником ... по многим предметам.

0
ответ дан 17 December 2019 в 22:10
поделиться

Я думаю, это нормально, если ни вы, ни кто-либо другой не поддадитесь искушению повторно использовать «пустые» столбцы для других целей.

Под этим я подразумеваю, что в вашей новой таблице будут столбцы, которые будут заполнены только для учителей. Кто-то может решить, что есть другое значение, которое им нужно сохранить для не учителей, и использовать один из столбцов учителя для его хранения, потому что в конце концов оно никогда не понадобится для этого не учителя, и таким образом мы не нужно изменить таблицу, и довольно скоро ваш код заполнится вещами, тестирующими типы строк, чтобы определить, что содержит каждый столбец.

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

0
ответ дан 17 December 2019 в 22:10
поделиться

Я бы не стал помещать все поля в одну таблицу. Соотношение учеников и учителей велико, поэтому на 100 учителей может быть 10000 учеников с NULL в этих 17 полях. Обычно модель выглядит примерно так:

teacher_model_01

В вашем случае нет специальных полей для студентов, поэтому вы можете опустить таблицу Student , поэтому модель будет выглядеть так

teacher_model_02

Примечание что для моделирования наследования таблица Teacher имеет UserID , то же самое, что и таблица User ; Сравните это с вашим примером, который имеет Id для таблицы Teacher , а затем отдельный user_id .

0
ответ дан 17 December 2019 в 22:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: