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

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

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

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

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

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

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

вполне оптимально. назначьте в каждой таблице идентификатор пользователя первичным ключем и джойны будут быстро выполняться
...
Рейтинг: 0 / 0
10.10.2008, 09:22:26
    #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
10.10.2008, 09:28:58
    #35587170
Дмитрий16
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пользователи системы разных типов
Monty67Здравствуйте, коллеги!
Проектирую БД, в которой центральным элементом буду являться пользователи. Причем пользователей системы будет несколько типов. Для каждого типа характерен свой набор атрибутов.

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

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

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

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

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

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

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

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

Или написать ХП для добавления.
...
Рейтинг: 0 / 0
10.10.2008, 16:28:21
    #35588632
Shtock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пользователи системы разных типов
...
Рейтинг: 0 / 0
12.10.2008, 14:04:42
    #35589936
Monty67
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пользователи системы разных типов
Shtock баян
Никакой полезной информации из предложенного Вами обсуждения я не извлек. Обсуждается другая предметная область, где в итоге пришли к реализации с одной таблицей и ролями. Это не мой случай.
Что по Вашему там могло быть для меня полезным?
...
Рейтинг: 0 / 0
13.10.2008, 14:44:02
    #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
14.10.2008, 20:22:31
    #35594481
Monty67
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пользователи системы разных типов
Да, с этим все понятно. Вставка будет реализована с помощью транзакции из двух запросов INSERT.

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

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

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

там и дальше есть интересные моменты.
...
Рейтинг: 0 / 0
19.10.2008, 20:28:44
    #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]