Добавление новых полей против создания отдельной таблицы - PullRequest
6 голосов
/ 03 июля 2010

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

users таблица

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

teachers таблица

  • id
  • user_id
  • subject
  • 17 других полей

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

например

users

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

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

Ответы [ 6 ]

2 голосов
/ 03 июля 2010

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

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

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

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

0 голосов
/ 03 июля 2010

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

teacher_model_01

В вашем случае нет специальных полей для студентов, поэтому вы можете опустить Student таблица, поэтому модель будет выглядеть следующим образомUser стол;Сравните это с вашим примером, который имеет Id для таблицы Teacher, а затем отдельный user_id.

0 голосов
/ 03 июля 2010

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

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

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

0 голосов
/ 03 июля 2010

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

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

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

0 голосов
/ 03 июля 2010

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

Я ожидал бы, что относящийся к teacher_id для классов / секций ...

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

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

0 голосов
/ 03 июля 2010

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

...