powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Пользователи в базе
8 сообщений из 8, страница 1 из 1
Пользователи в базе
    #38127638
kezman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый вечер всем!

У меня есть 2 типа пользователей, которые могут регистрироваться на сайте.
Клиенты (у них своя форма регистрации и свой профиль) и компании (другая форма регистрации и совершенно другие поля).
Но оба они с точки зрения администратора системы являются пользователями.
Как правильно спроектировать базу данных?
MySQL - InnoDB (есть внешние ключи).

Таблица user, client и company, где в user хранить логин и пароль, а в остальных таблицах хранить все поля, которые нужны каждому типу пользователей + в качестве Primary key хранить user_id в таблицах client и company и связь с таблицей user как 1 к 1му?

В этом случае единственным вопросом (хорошо ли это) остается отсутствие автоинкремента и "дырки" в PK в таблицах client и company.

Или может другая архитектура нужна?
...
Рейтинг: 0 / 0
Пользователи в базе
    #38127702
Кот Матроскин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Насчет трех таблиц - нормальyая схема. (если Вы совершенно точно уверены, что никогда-никогда одной компании не потребуется нескольких регистраций).
Делать ли user_ID первичным ключом в Client и Company - философский вопрос. Проблемы в "дырках" я не вижу вообще никакой, проблема имхо в другом - это разные сущности с разным жизненным циклом. Например, клиент зарегистрировался у Вас 1 раз, потом регистрацию удалили, потом он регистрируется второй раз - Вам придется создавать еще одну запись в client, теряя всю историю по прошлой регистрации.

Имхо лучше все-таки сделать отдельные первичные ключи в таблицах client и company, и оставить nullable-ссылку user_id
...
Рейтинг: 0 / 0
Пользователи в базе
    #38127707
Максим Н
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kezmanотсутствие автоинкремента и "дырки" в PK в таблицах client и company.

Это как?

Буду ли дырки в PK или не будут, это от вас зависит.

А так нормальная схема.
...
Рейтинг: 0 / 0
Пользователи в базе
    #38127765
kezman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кот МатроскинНасчет трех таблиц - нормальyая схема. (если Вы совершенно точно уверены, что никогда-никогда одной компании не потребуется нескольких регистраций).
Делать ли user_ID первичным ключом в Client и Company - философский вопрос. Проблемы в "дырках" я не вижу вообще никакой, проблема имхо в другом - это разные сущности с разным жизненным циклом. Например, клиент зарегистрировался у Вас 1 раз, потом регистрацию удалили, потом он регистрируется второй раз - Вам придется создавать еще одну запись в client, теряя всю историю по прошлой регистрации.

Имхо лучше все-таки сделать отдельные первичные ключи в таблицах client и company, и оставить nullable-ссылку user_id
Спасибо за ответ!

Думаю, что если клиент потеряем свои доступы он все равно заново будет регистрироваться, поэтому это не настолько серьезная проблема))

А вот что касается отдельных PK в таблицах client и company - я действительно думал, но в таком случае получается отношение 1 ко многим, т.е. один User может стать Двумя клиентами и с точки зрения схемы БД это будет правильно.
Но я понимаю, что на серверной части можно не предусматривать такой функционал, и такого не будет никогда.
Интересовало best practices и возможные подводные камни этих 2х решений.
...
Рейтинг: 0 / 0
Пользователи в базе
    #38127768
kezman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Максим Нkezmanотсутствие автоинкремента и "дырки" в PK в таблицах client и company.

Это как?

Буду ли дырки в PK или не будут, это от вас зависит.

А так нормальная схема.

В случае такой схемы дырки в PK будут в таблицах company и client и от меня это не зависит)
Т.к. сначала пользователь регится и создается запись в таблице user.
А затем он выбирает - компания он или клиент.
Выбрал компанию.
Следующий юзер выбирает клиента.
Третий юзер выбирает компанию.
Получается, что в таблице company строчки с PK - 1, а потом сразу 3.
Это и есть дырка.
Проблема действительно не серьезная, вероятнее ее вообще не стоит даже проблемой называть, но упомянуть для целостности картины стоило.
...
Рейтинг: 0 / 0
Пользователи в базе
    #38127867
Кот Матроскин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kezmanДумаю, что если клиент потеряем свои доступы он все равно заново будет регистрироваться, поэтому это не настолько серьезная проблема))

Вот именно - клиент-то будет регистрироваться заново, но у системы будет возможность
обнаружить, что человек-то на самом деле тот же самый, создать новую запись в User,
но привязать ее к старой client (убив старую ссылку).
Делая первичным ключом userid - Вы жестко связываете в системе сущности, которые в
реальномо мире, вообще говоря, связаны не очень жестко. Если считаете что абстракция,
лежащая в основе Вашей системы, от такого упрощения не пострадает - Вам виднее.
Имхо выигрыша от такого решения немного (на одно поле меньше в таблицах), а ограничения на развитие системы - появляются.


kezmanА вот что касается отдельных PK в таблицах client и company - я действительно думал, но в таком случае получается отношение 1 ко многим, т.е. один User может стать Двумя клиентами и с точки зрения схемы БД это будет правильно.

Если Вас это смущает - можете повесить Unique constraint на поле userID в таблицах Client
и company, тогда все будет предусмотрено прямо в схеме.
...
Рейтинг: 0 / 0
Пользователи в базе
    #38127933
kezman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кот МатроскинkezmanДумаю, что если клиент потеряем свои доступы он все равно заново будет регистрироваться, поэтому это не настолько серьезная проблема))

Вот именно - клиент-то будет регистрироваться заново, но у системы будет возможность
обнаружить, что человек-то на самом деле тот же самый, создать новую запись в User,
но привязать ее к старой client (убив старую ссылку).
Делая первичным ключом userid - Вы жестко связываете в системе сущности, которые в
реальномо мире, вообще говоря, связаны не очень жестко. Если считаете что абстракция,
лежащая в основе Вашей системы, от такого упрощения не пострадает - Вам виднее.
Имхо выигрыша от такого решения немного (на одно поле меньше в таблицах), а ограничения на развитие системы - появляются.


kezmanА вот что касается отдельных PK в таблицах client и company - я действительно думал, но в таком случае получается отношение 1 ко многим, т.е. один User может стать Двумя клиентами и с точки зрения схемы БД это будет правильно.

Если Вас это смущает - можете повесить Unique constraint на поле userID в таблицах Client
и company, тогда все будет предусмотрено прямо в схеме.

Спасибо большое за аргументированный ответ и ценное инфо!!!
Действительно ограничения на развитие системы это не айс, а проблем с доп. полем нет, конечно же))))))))))
Сделаю именно так!
...
Рейтинг: 0 / 0
Пользователи в базе
    #38131580
RT01021977
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
да простит меня kezman за то, что подмазываюсь к его вопросу - но у меня ситуация похожая, и поэтому хочу спросить у специалистов за правильность выбранной схемы:

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

вот какую логическую модель я изобразил:
таблица "Объект контроля" имеет PK. Этот ключ мигрирует в таблицы "Транспортное средство", "Стационарный объект" и т.д.

верно ли я спроектировал модель?

...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Пользователи в базе
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]