2016-02-04 3 views
1

Предположим, у меня есть таблица входа в систему, содержащую id, username, password, type и linked_idSQL Рекомендации: использование столбца для хранения двух разных типов данных?

Столбец type определяет, принадлежит ли этот Войти сотруднику или клиенту.

Если они являются сотрудником, linked_id - их идентификатор в таблице сотрудника.

Если это клиент, linked_id - их идентификатор в таблице клиента.

Интуитивно это кажется плохой идеей, но, кроме того, что я имею дело с ограничениями внешнего ключа, я не могу думать или повод не делать этого.

Это также вызывает другой вопрос: важно ли всегда иметь ограничения FK в таких ситуациях?

Мысли?

+0

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

+0

Да, всегда хорошо иметь ограничения FK в этом типе связанных данных. В противном случае легко удалить учетные записи и оставить осиротевших клиентов или сотрудников; или в вашем случае проектирования, удалите записи сотрудника или клиента и оставьте сиротские записи входа. – randyh22

ответ

2

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

В качестве примера:

  • Логин: Id (PK), Имя пользователя, Пароль
  • Сотрудники: Id (PK), имя, EmployeeNumber, login_id (FK_LoginId)
  • Клиенты: Id (PK), имя, адрес, login_id (FK_LoginId)

Тогда вы по своей сути знаете, что "типа" каждый Войти является в какой таблице хранятся данные ed in.

+0

Отличное понимание. Теперь, когда вы указали это, это кажется болезненно очевидным. Спасибо, что похлопал по голове! – pbarney

+0

Конечно, теперь проблема заключается в выяснении, какой пользователь представляет логин: клиент или сотрудник, для которого требуется сканирование, возможно, обе таблицы (клиент и сотрудник) для ответа. – pbarney

+0

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

2

Проще всего просто добавить дополнительный столбец в вашей базе данных и получить EmployeeId и ClientId, чтобы упростить понимание структуры таблицы.

Вы также можете утверждать, что в вашем проекте базы данных отсутствует объект Entity. В качестве примера, что, если сотрудник также был клиентом? Как бы нынешняя система справилась с этим обстоятельством?

У вас может быть промежуточная таблица для управления этим и определения статуса этого Лица.

I.e. имеют таблицу Login.

Поле: ID, username, password, type, PersonId

А потом другой стол Person с EmployeeId и ClientId, хотя я думаю, что это вызвало бы много NULL ценности, которые он будет поддерживать вышеуказанное обстоятельство я описал.

В качестве дополнительной записке, я не хотел бы взглянуть на существующие Login таблицы, определить поле linked_id и затем решить, какие таблицы этот столбец относится к, Employee или Client?

Вы также могли бы разделить на это как @ randyh22 предложил и удалить linked_id поле в целом и имеют Login идентификаторы в дочерних таблицах (Employees и Clients).

Restructure:

Войти стол: LoginID, Имя пользователя, Пароль (Убедитесь, что хешируется)

Сотрудник стол: EmployeeID, Имя, Фамилия, LoginID

таблица Client : ClientId, Forename, Surname, LoginId

+0

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

+0

@MikeChristensen - Я сейчас в этой ситуации на работе. Полностью согласен! –

+1

Это плохой дизайн базы данных. Обычно эта ситуация означает, что вы указываете неправильное направление на свои идентификаторы. В случае OPs нет ничего сложного в том, что они должны иметь точку столбца на нескольких таблицах. – randyh22