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

Я придумал сделать следующим образом
t_users - общая таблица пользователей (здесь будут сохраняться идентификаторы пользователей и общие атрибуты, например, текущее состояние и тип - физ. лица, юр. лица и т.д.).
t_physical_users - пользователи, являющиеся физическими лицами (ФИО, паспортные данные, контактная информация и т.д.)
t_juridical_users - пользователи, являющиеся юридическими лицами (реквизиты, юр. адрес, инн/кпп и т.д.)

В таблицах t_physical_users и t_juridical_users будут сохраняться ссылки на таблицу t_users.

Насколько это оптимально? Как считаете?
...
Рейтинг: 0 / 0
Пользователи системы разных типов
    #35586909
Bely
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Monty67Насколько это оптимально? Как считаете?Вполне ничего, с пивом потянет.
...
Рейтинг: 0 / 0
Пользователи системы разных типов
    #35587140
IT-Shaman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Monty67Здравствуйте, коллеги!
Проектирую БД, в которой центральным элементом буду являться пользователи. Причем пользователей системы будет несколько типов. Для каждого типа характерен свой набор атрибутов.

Я придумал сделать следующим образом
t_users - общая таблица пользователей (здесь будут сохраняться идентификаторы пользователей и общие атрибуты, например, текущее состояние и тип - физ. лица, юр. лица и т.д.).
t_physical_users - пользователи, являющиеся физическими лицами (ФИО, паспортные данные, контактная информация и т.д.)
t_juridical_users - пользователи, являющиеся юридическими лицами (реквизиты, юр. адрес, инн/кпп и т.д.)

В таблицах t_physical_users и t_juridical_users будут сохраняться ссылки на таблицу t_users.

Насколько это оптимально? Как считаете?

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

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
CREATE  TABLE IF NOT EXISTS `mydb`.`Users` (
  `userId` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT ,
  `type` ENUM('physical', 'juridical', 'employee', 'server') NULL ,
  `status` ENUM('active', 'blocked') NULL ,
  PRIMARY KEY (`userId`) )
COMMENT = 'Общая таблица пользователей системы';

CREATE  TABLE IF NOT EXISTS `mydb`.`JuridicalClients` (
  `userId` BIGINT UNSIGNED NOT NULL ,
  PRIMARY KEY (`userId`) ,
)

CREATE  TABLE IF NOT EXISTS `mydb`.`PhysicalClients` (
  `userId` BIGINT UNSIGNED NOT NULL ,
  `name` VARCHAR( 255 ) NOT NULL ,
  `surname` VARCHAR( 255 ) NOT NULL ,
  `patronymic` VARCHAR( 255 ) NOT NULL ,
  `docType` ENUM('passport', 'residential') NOT NULL ,
  `docSeries` VARCHAR( 45 ) NOT NULL ,
  `docNumber` VARCHAR( 45 ) NOT NULL ,
  `docIssueDate` DATE NOT NULL ,
  `docIssuedBy` VARCHAR( 300 ) NOT NULL ,
  `regDate` DATE NOT NULL ,
  `contractNum` BIGINT NOT NULL ,
  PRIMARY KEY (`userId`)
)

Один-к-одному: Users <-> JuridicalClients
Один-к-одному: Users <-> PhysicalClients

У меня вопрос на счет того, как обеспечить целостность. Грубо говоря в таблице JuridicalClients не может быть записи с идентификатором, который уже присутствует в таблице PhysicalClients.
Ведь пользователь не может быть одновременно и физическим лицом и юридическим.
Как правильно добавить пользователя. Допустим я хочу добавить новое юр. лицо. Как это грамотно сделать одним запросом на вставку?..
...
Рейтинг: 0 / 0
Пользователи системы разных типов
    #35587170
Дмитрий16
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Monty67Здравствуйте, коллеги!
Проектирую БД, в которой центральным элементом буду являться пользователи. Причем пользователей системы будет несколько типов. Для каждого типа характерен свой набор атрибутов.

Насколько это оптимально? Как считаете?

перечислю возможные проблемы:

1. Работал человек ЧЛ позже создал своё ЮР ЛИЦО. Но при этом иногда продолжает работать как ЧЛ а иногда как ЮР Лицо. После он купил еще одну фирму однодневку, потом ещё.

2. Появляется очень большая фирма и хочется отразить не только день рождения фирмы но и день рождения директора.

Итого - добавляй связи и отношения между фирмами.

P.S. Я пришел к EAV структуре для добавочных атрибутов.
...
Рейтинг: 0 / 0
Пользователи системы разных типов
    #35587192
Monty67
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
У меня такой поблемы возникнуть не может по той причине, что пользователи это те товарищи, с которыми заключается договор. ПО моей придмтной области меня не интересует что он является физ. лицом и юр. лицом. Или что у него 10 организаций. Если каждая заключила договор, то ради бога.
...
Рейтинг: 0 / 0
Пользователи системы разных типов
    #35587561
474
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У вас частные предприниматели кем в системе будут? Физиками или юриками?
...
Рейтинг: 0 / 0
Пользователи системы разных типов
    #35588154
Monty67
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
К юрикам, а при необходимости можно будет создать новую табличу для ЧПшников.
Я для этого такой подход и предлагаю, чтобы можно было вынести отдельно пользователей у которых свои личные атрибуты.
...
Рейтинг: 0 / 0
Пользователи системы разных типов
    #35588277
Bely
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Почитайте вот это обсуждение .
Оно все про это.
...
Рейтинг: 0 / 0
Пользователи системы разных типов
    #35588298
Bely
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Monty67У меня вопрос на счет того, как обеспечить целостность. Грубо говоря в таблице JuridicalClients не может быть записи с идентификатором, который уже присутствует в таблице PhysicalClients.Ведь пользователь не может быть одновременно и физическим лицом и юридическим.Посмотрите ссылку, которую я выложил в предыдущем посте.
Там был и такой вариант.

Хотя очень часто на это "кладут" и считают, что это ограничение будет реализовано на уровне интерфейса.

Monty67Как правильно добавить пользователя. Допустим я хочу добавить новое юр. лицо. Как это грамотно сделать одним запросом на вставку?..Ну, одним запросом в две таблицы - это не все БД еще умеют. Добавлять придется, скорее всего, двумя запросами.

Или написать ХП для добавления.
...
Рейтинг: 0 / 0
Пользователи системы разных типов
    #35588632
Фотография Shtock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Пользователи системы разных типов
    #35589936
Monty67
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shtock баян
Никакой полезной информации из предложенного Вами обсуждения я не извлек. Обсуждается другая предметная область, где в итоге пришли к реализации с одной таблицей и ролями. Это не мой случай.
Что по Вашему там могло быть для меня полезным?
...
Рейтинг: 0 / 0
Пользователи системы разных типов
    #35591360
Николай1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Monty67Приведу пример того, что у меня имеется на текущий момент.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
CREATE  TABLE IF NOT EXISTS `mydb`.`Users` (
  `userId` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT ,
  `type` ENUM('physical', 'juridical', 'employee', 'server') NULL ,
  `status` ENUM('active', 'blocked') NULL ,
  PRIMARY KEY (`userId`) )
COMMENT = 'Общая таблица пользователей системы';

CREATE  TABLE IF NOT EXISTS `mydb`.`JuridicalClients` (
  `userId` BIGINT UNSIGNED NOT NULL ,
  PRIMARY KEY (`userId`) ,
)

CREATE  TABLE IF NOT EXISTS `mydb`.`PhysicalClients` (
  `userId` BIGINT UNSIGNED NOT NULL ,
  `name` VARCHAR( 255 ) NOT NULL ,
  `surname` VARCHAR( 255 ) NOT NULL ,
  `patronymic` VARCHAR( 255 ) NOT NULL ,
  `docType` ENUM('passport', 'residential') NOT NULL ,
  `docSeries` VARCHAR( 45 ) NOT NULL ,
  `docNumber` VARCHAR( 45 ) NOT NULL ,
  `docIssueDate` DATE NOT NULL ,
  `docIssuedBy` VARCHAR( 300 ) NOT NULL ,
  `regDate` DATE NOT NULL ,
  `contractNum` BIGINT NOT NULL ,
  PRIMARY KEY (`userId`)
)

Один-к-одному: Users <-> JuridicalClients
Один-к-одному: Users <-> PhysicalClients

У меня вопрос на счет того, как обеспечить целостность. Грубо говоря в таблице JuridicalClients не может быть записи с идентификатором, который уже присутствует в таблице PhysicalClients.
Ведь пользователь не может быть одновременно и физическим лицом и юридическим.
Как правильно добавить пользователя. Допустим я хочу добавить новое юр. лицо. Как это грамотно сделать одним запросом на вставку?..

Одним запросом на вставку заполнить две таблицы нельзя.
...
Рейтинг: 0 / 0
Пользователи системы разных типов
    #35594481
Monty67
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, с этим все понятно. Вставка будет реализована с помощью транзакции из двух запросов INSERT.

А как быть с тем, что в разных типах объектах не может быть записей с одинаковым родителем? Я имею в виду ситуацию, что не может быть клиента, который является одновременно и физическим и юридическим лицом.
...
Рейтинг: 0 / 0
Пользователи системы разных типов
    #35594944
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Monty67Да, с этим все понятно. Вставка будет реализована с помощью транзакции из двух запросов INSERT.

А как быть с тем, что в разных типах объектах не может быть записей с одинаковым родителем? Я имею в виду ситуацию, что не может быть клиента, который является одновременно и физическим и юридическим лицом.Можно сделать ссылку не просто на userId, а на 2 поля - userId и type

В подчинённых таблицах, конечно, добавить этот type и сделать чек констрэйн
...
Рейтинг: 0 / 0
Пользователи системы разных типов
    #35595132
Bely
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Monty67А как быть с тем, что в разных типах объектах не может быть записей с одинаковым родителем? Я имею в виду ситуацию, что не может быть клиента, который является одновременно и физическим и юридическим лицом.Вам уже сказали, но перечитайте мою ссылку внимательнее

там и дальше есть интересные моменты.
...
Рейтинг: 0 / 0
Пользователи системы разных типов
    #35603114
Monty67
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alexeyvgMonty67Да, с этим все понятно. Вставка будет реализована с помощью транзакции из двух запросов INSERT.

А как быть с тем, что в разных типах объектах не может быть записей с одинаковым родителем? Я имею в виду ситуацию, что не может быть клиента, который является одновременно и физическим и юридическим лицом.Можно сделать ссылку не просто на userId, а на 2 поля - userId и type

В подчинённых таблицах, конечно, добавить этот type и сделать чек констрэйн
Я понял Ваш вариант. Я использую СУБД MySQL 5.1, и насколько я выяснил, CHECK CONSTRAINT не работает в ней. Реализован чисто синтаксически. Если я ошибаюсь, поправьте меня, пожалуйста.
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Пользователи системы разных типов
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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