Реляционная модель как таковая не поддерживает «наследование», что может помочь решить эту проблему (хотя некоторые механизмы БД, такие как PostgreSQL, поддерживают наследование).
Итак, я бы сначала спросил себя: нужно ли, чтобы разные типы пользователей могли появляться в одном и том же контексте, по крайней мере в некоторых случаях? Если это так, то вы не можете просто скопировать и вставить «общие столбцы» в несколько таблиц (по крайней мере, без ущерба для проверок целостности, которые вы могли бы получить в этих случаях через внешние ключи на одну таблицу).
Второй вопрос - это Может ли пользователь удерживать более одной роли? Во многих случаях это было бы необычным, но не совсем невозможно, например. сотрудник может также быть поставщиком или клиентом.
Если бы я не мог получить четких ответов на такие вопросы, направляя меня в противном случае, я бы установил таблицу пользователей только с общими полями; и отдельные таблицы для поставщиков, сотрудников, бета-тестеров, клиентов и любые другие виды и роли, которые у меня могут быть для пользователей, каждая из которых имеет только свои собственные специализированные столбцы плюс внешний ключ в таблице пользователей, чтобы забрать остальные.
Я понимаю, что нормализованные схемы сейчас не в моде, но они добросовестно служили мне в течение десятилетий, и у меня есть глубокая привязанность к ним - я только денормализую, когда мне нужна определенная оптимизация, и это происходит реже, чем одна мог подумать!-).
Возможно, что некоторая денормализация, которая может быть полезной здесь, представляет собой столбец перечисления в таблице пользователей, указывающий «основную» или «единственную» роль каждого конкретного использования (он может быть обнуляемым и, возможно, равномерно пустым в начале, если я был достаточно настойчив, чтобы иметь его с самого начала ...; -) ... но я, скорее всего, буду ждать его добавления, если и когда производительность некоторых конкретных запросов потребует его как конкретной оптимизации, а не для разработки схемы таким образом с самого начала (обратите внимание, что это ключевая причина никогда не использовать SELECT * FROM
в ваших запросах - если вы добавите ALTER TABLE
, чтобы добавить столбец, то SELECT *
- это один бит, который сломался бы! -).
Спасибо, dj_segfault. Я пошел с вашей опцией # 1 и создал пользовательскую таблицу с общими полями и поле userType, на которое ссылаются другие, более «конкретные» пользовательские таблицы. NULLS определенно вызывали головные боли, я рад, что избавился от них сейчас! – littleK
исправьте меня, если я ошибаюсь (это случается очень много), но если кто-то должен хранить свои данные таким образом, чтобы общие поля находились на уровне «пользователя», например, fname, lname, email, pw ... и так далее , Невозможно было бы получить более конкретную информацию пользователя с одним запросом? Для получения более конкретной информации всегда требуется второй запрос, основанный на типе usertype. – ackerchez
@ackerchez Sure есть. Все, что вам нужно сделать, чтобы получить всю информацию, - это внутреннее соединение всех пользовательских таблиц пользовательского типа с основной пользовательской таблицей любым вашим UID. Столбцы для таблиц, которые не для этого типа пользователя, будут пустыми. –