powered by simpleCommunicator - 2.0.18     © 2024 Programmizd 02
Map
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Как правльно создать таблицу пользователей двух типов в БД?
25 сообщений из 27, страница 1 из 2
Как правльно создать таблицу пользователей двух типов в БД?
    #40082589
jaketaylor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Проектируется БД. На сайте должно быть типы аккаунтов со столбцами, перечисленными в скобках:
- Физическое лицо (фамилия, имя, email, password);
- Юридическое лицо (фамилия, имя, email, password + название компании, УНП компании).

Имеются общие данные: фамилия, имя, email, password, которые можно вынести в отдельную таблицу, назовем её accounts . Верно? Какие должны быть таблицы тогда в БД? Таблица accounts, таблица individuals и таблица company вот так:


либо создать только одну таблицу accounts и там, где у юзера будет роль = "Физическое лицо" заполнятся null поля, которые должны быть заполнены у компании, а это поля название компании, УНП компании?
...
Рейтинг: 0 / 0
Как правльно создать таблицу пользователей двух типов в БД?
    #40082596
Stanislav P
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Зачем нужно разделение на физических и юридических лиц?

PS. В системах с аутентификацией, обычно подразумевается, что входить в систему может человек, который может работать в компании.
...
Рейтинг: 0 / 0
Как правльно создать таблицу пользователей двух типов в БД?
    #40082600
jaketaylor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Stanislav P, это площадка, где пользователь может создать заказ , а компания может создать заказ + забирать заказы физ. лиц.
То есть у них возможности, в зависимости от ролей, будут разные. Ну и у типа аккаунта "Компания" добавляются соответствующие поля, характерные компаниям (юридический адрес, наименование компании, УНП), которые будут фигурировать при создании заказа тоже.
...
Рейтинг: 0 / 0
Как правльно создать таблицу пользователей двух типов в БД?
    #40082627
Stanislav P
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
jaketaylor,

Если не усложнять систему и идти по самому простому пути, то вариант который с тремя таблицами (юзеры, частники и фирмы) вполне нормальный.
...
Рейтинг: 0 / 0
Как правльно создать таблицу пользователей двух типов в БД?
    #40082631
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jaketaylorНа сайте должно быть типы аккаунтов со столбцами, перечисленными в скобках
Имеются общие данные: фамилия, имя, email, password, которые можно вынести в отдельную
таблицу, назовем её accounts. Верно?

Неверно. Компании - совершенно отдельно, у них нет ни пароля, ни аккаунта. У них есть
список физических лиц, способных действовать от лица этой компании.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как правльно создать таблицу пользователей двух типов в БД?
    #40082693
jaketaylor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov, всё таки я решил, что на сайте будет один тип людей регистрироваться - это фирмы. Причем только один аккаунт = одна фирма. Иначе придется ещё и фирмы администратору регистрировать, чтобы пользователи при регистрации выбирали в поле "Место работы", а это уже не ахти.
Подойдет ли такое решение?

Код: plsql
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.
26.
27.
28.
29.
30.
31.
32.
CREATE TABLE user_roles (
    role_id TINYINT UNSIGNED NOT NULL UNIQUE AUTO_INCREMENT PRIMARY KEY,
    role_name ENUM('administrator', 'company', 'guest')
);

CREATE TABLE user_statuses (
    status_id TINYINT UNSIGNED NOT NULL UNIQUE AUTO_INCREMENT PRIMARY KEY,
    status_name ENUM('activated', 'not_activated', 'banned')
);

CREATE TABLE users (
    user_id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
    user_first_name VARCHAR(50) NOT NULL,
    user_last_name VARCHAR(50) NOT NULL,
    user_login VARCHAR(50) NOT NULL UNIQUE,
    user_email VARCHAR(70) NOT NULL UNIQUE,
    user_password_hash VARCHAR(255) NOT NULL,
    user_registration_date DATE NOT NULL,
    role_id TINYINT UNSIGNED NOT NULL,
    status_id TINYINT UNSIGNED NOT NULL,
    FOREIGN KEY (role_id) REFERENCES user_roles(role_id),
    FOREIGN KEY (status_id) REFERENCES user_statuses(status_id)
);

CREATE TABLE companies (
    company_id BIGINT UNSIGNED NOT NULL UNIQUE AUTO_INCREMENT PRIMARY KEY,
    company_name VARCHAR(150) NOT NULL UNIQUE,
    company_address VARCHAR(200) NOT NULL,
    company_unp TINYINT UNSIGNED NOT NULL UNIQUE,
    user_id BIGINT UNSIGNED NOT NULL UNIQUE,
    FOREIGN KEY (user_id) REFERENCES users (user_id)
);
...
Рейтинг: 0 / 0
Как правльно создать таблицу пользователей двух типов в БД?
    #40082695
jaketaylor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Stanislav P
jaketaylor,

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


Я все таки подумал, лучше пуcть только фирмы регистрируются.
...
Рейтинг: 0 / 0
Как правльно создать таблицу пользователей двух типов в БД?
    #40082697
jaketaylor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
del
...
Рейтинг: 0 / 0
Как правльно создать таблицу пользователей двух типов в БД?
    #40082700
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jaketaylorПодойдет ли такое решение?

Для курсовика - подойдёт, для реального проекта - нет.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как правльно создать таблицу пользователей двух типов в БД?
    #40082702
jaketaylor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov

jaketaylorПодойдет ли такое решение?

Для курсовика - подойдёт, для реального проекта - нет.

Почему для реального проекта не пойдет?

А что скажете по этому поводу? Компании не могут повторяться, но в одной компании может работать несколько экспедиторов (таблица - forwarders ):

Код: plsql
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.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
CREATE TABLE user_roles (
    role_id TINYINT UNSIGNED NOT NULL UNIQUE AUTO_INCREMENT PRIMARY KEY,
    role_name ENUM('administrator', 'user', 'guest')
);

CREATE TABLE user_statuses (
    status_id TINYINT UNSIGNED NOT NULL UNIQUE AUTO_INCREMENT PRIMARY KEY,
    status_name ENUM('activated', 'not_activated', 'banned')
);

CREATE TABLE users (
    user_id BIGINT UNSIGNED NOT NULL UNIQUE AUTO_INCREMENT PRIMARY KEY,
    user_first_name VARCHAR(50) NOT NULL,
    user_last_name VARCHAR(50) NOT NULL,
    user_login VARCHAR(50) NOT NULL UNIQUE,
    user_email VARCHAR(70) NOT NULL UNIQUE,
    user_password_hash VARCHAR(255) NOT NULL,
    user_registration_date DATE NOT NULL,
    role_id TINYINT UNSIGNED NOT NULL,
    status_id TINYINT UNSIGNED NOT NULL,
    FOREIGN KEY (role_id) REFERENCES user_roles(role_id),
    FOREIGN KEY (status_id) REFERENCES user_statuses(status_id)
);

CREATE TABLE companies (
    company_id BIGINT UNSIGNED NOT NULL UNIQUE AUTO_INCREMENT PRIMARY KEY,
    company_name VARCHAR(150) NOT NULL UNIQUE,
    company_address VARCHAR(200) NOT NULL,
    company_unp TINYINT UNSIGNED NOT NULL UNIQUE
);

CREATE TABLE forwarders (
    forwarder_id BIGINT UNSIGNED NOT NULL UNIQUE AUTO_INCREMENT PRIMARY KEY,
    user_id BIGINT UNSIGNED NOT NULL,
    company_id BIGINT UNSIGNED NOT NULL,
    FOREIGN KEY (user_id) REFERENCES users(user_id),
    FOREIGN KEY (company_id) REFERENCES companies(company_id)
);
...
Рейтинг: 0 / 0
Как правльно создать таблицу пользователей двух типов в БД?
    #40082720
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jaketaylorПочему для реального проекта не пойдет?

Потому что "один пароль на всю компанию" - реально плохая идея для компании крупнее, чем
"Рога и Копыта". Люди приходят и уходят. С сайтом могут работать разные люди с разными
целями. Менять пароль каждый раз после увольнения одного - это не работает.

При регистрации компании на (приличном) сайте сразу регистрируется "доверенный
пользователь", администратор. Он, в свою очередь, может создать дополнительных
пользователей для этой компании (как доверенных, так и с урезанными правами). После чего
эти пользователи могут работать с сайтом от имени компании в пределах имеющихся у них прав.

И, кстати, из-за закона о персональных данных Вам придётся написать документ, в котором
расписано для чего вы храните и используете каждый кусок информации о компании и людях (а
также кому и при каких обстоятельствах её передаёте). Так что сразу начните с объяснения
зачем в вашей базе ФИО, разбитое на три поля.

PS: Хэш пароля - технология прошлого века, нынче рулит SRP.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как правльно создать таблицу пользователей двух типов в БД?
    #40082743
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jaketaylor
либо создать только одну таблицу accounts и там, где у юзера будет роль = "Физическое лицо"

Зависит от бизнес-логики, работающей с этими данными. Если название нужно только для того, чтобы написать на страничке "Привет, %name%!" - лучше одна таблица. Если от этого типа начинает зависеть что-то в функционировании - лучше схема, описывающая реальные взаимоотношения между понятиями (что на практике означает много таблиц и нетривиальные связи между ними. Например: человек А когда-то работал в компании Б, а теперь он на роли В в фирме Г и одновременно на роли Д в фирме Е).
...
Рейтинг: 0 / 0
Как правльно создать таблицу пользователей двух типов в БД?
    #40082904
Stanislav P
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
jaketaylor
Код: plsql
1.
2.
3.
4.
CREATE TABLE user_roles (
    role_id TINYINT UNSIGNED NOT NULL UNIQUE AUTO_INCREMENT PRIMARY KEY,
    role_name ENUM('administrator', 'company', 'guest')
);



Предвижу огромные проблемы с безопасностью такого решения.
...
Рейтинг: 0 / 0
Как правльно создать таблицу пользователей двух типов в БД?
    #40082973
jaketaylor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Stanislav P
jaketaylor
Код: plsql
1.
2.
3.
4.
CREATE TABLE user_roles (
    role_id TINYINT UNSIGNED NOT NULL UNIQUE AUTO_INCREMENT PRIMARY KEY,
    role_name ENUM('administrator', 'company', 'guest')
);



Предвижу огромные проблемы с безопасностью такого решения.


В каких конкретных ситуациях и чем это может вылезть боком?
...
Рейтинг: 0 / 0
Как правльно создать таблицу пользователей двух типов в БД?
    #40083042
ldfanate
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В любом крупном справочнике контрагентов (особенно если его коллективно будут самонаполнять абы-кто, а не специально-выделенный специалист НСИшник), рано или поздно появятся дубли - смены фамилий, неправильное написание сложных фамилий, смена организационно-правовой формы организаций и проч.
Т.е. сразу надо закладывать поле для статуса Эталон/Дубликат, и табличку связей, чтобы потом объявив одну из записей эталонной, сохранить связность по заявкам, которые ранее нашлёпали с контировкой на контрагентов-дубликатов.
...
Рейтинг: 0 / 0
Как правльно создать таблицу пользователей двух типов в БД?
    #40083295
Stanislav P
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
jaketaylor
Stanislav P


Предвижу огромные проблемы с безопасностью такого решения.


В каких конкретных ситуациях и чем это может вылезть боком?


Если у тебя в системе есть таблица, где есть слово "администратор", а затем в коде есть условное сравнение: "ЕСЛИ id_роль_пользователя = id_"администратор" ТО..." считай твою систему взломали уже заранее.
...
Рейтинг: 0 / 0
Как правльно создать таблицу пользователей двух типов в БД?
    #40083297
Stanislav P
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ldfanate
Т.е. сразу надо закладывать поле для статуса Эталон/Дубликат, и табличку связей, чтобы потом объявив одну из записей эталонной, сохранить связность по заявкам, которые ранее нашлёпали с контировкой на контрагентов-дубликатов.


Тут вещь сложней, если есть финансовые документы, то повторная распечатка условного счёта за прошлый год, должна содержать все реквизиты активные на тот момент, а не банковский счёт открытый неделю назад.
...
Рейтинг: 0 / 0
Как правльно создать таблицу пользователей двух типов в БД?
    #40083413
Веrd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

jaketaylorНа сайте должно быть типы аккаунтов со столбцами, перечисленными в скобках
Имеются общие данные: фамилия, имя, email, password, которые можно вынести в отдельную
таблицу, назовем её accounts. Верно?

Неверно. Компании - совершенно отдельно, у них нет ни пароля, ни аккаунта. У них есть
список физических лиц, способных действовать от лица этой компании.

+1
Делаешь отдельно компании и отдельно физлица
В компанию добавляешь admin_id, manager_id
...
Рейтинг: 0 / 0
Как правльно создать таблицу пользователей двух типов в БД?
    #40083487
ldfanate
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторТут вещь сложней, если есть финансовые документы, то повторная распечатка условного счёта за прошлый год, должна содержать все реквизиты активные на тот момент, а не банковский счёт открытый неделю назад.
А зачем давать повод распечатывать повторно после закрытия периода в учёте?
Если в системе генерится платёжка, то она в себе (в своих полях) должна запоминать всё своё состояние на момент её формирования, а не городить огороды с динамическим подтягиванием из истории справочников НСИ. Т.е. разумный уровень избыточности хранения информации - для любого ИУСа скорее плюс.

Те нормальные формы БД - это скорее академический инструмент обучения, далеко не всегда нужно стремиться к нормализации структуры БД. Иногда дешевле и надёжнее продублировать.
...
Рейтинг: 0 / 0
Как правльно создать таблицу пользователей двух типов в БД?
    #40083499
Stanislav P
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ldfanate
А зачем давать повод распечатывать повторно после закрытия периода в учёте?

Бумажные документы имеют свойство теряться и портиться.
ldfanate
Если в системе генерится платёжка, то она в себе (в своих полях) должна запоминать всё своё состояние на момент её формирования, а не городить огороды с динамическим подтягиванием из истории справочников НСИ.

Тогда огород из подтягивания верных значений на заданную дату перемещается в сторону огорода с заменой в платёжках id плательщика на его наименование при закрытии периода, что влечёт за собой ну очень забавную переделку структуры БД.
...
Рейтинг: 0 / 0
Как правльно создать таблицу пользователей двух типов в БД?
    #40083510
ldfanate
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторБумажные документы имеют свойство теряться и портиться.
Это если главбуха и соответствующего зама по направлению деятельности не гоняет директор предприятия. Утеря оригиналов первичных учётных документов - серьёзное нарушение, которое лечится организационными мерами (и оргвыводами в том числе).

авторТогда огород из подтягивания верных значений на заданную дату перемещается в сторону огорода с заменой в платёжках id плательщика на его наименование при закрытии периода, что влечёт за собой ну очень забавную переделку структуры БД.
Не перемещается.
Если возник факт хозяйственной жизни "платёжку сгенерили по кривым реквизитам контрагента, и она завёрнута банком", то аннулируют старую и сгенерят новую правильную платёжку (старая же всёравно позицией банковской выписки не закроется - её банк не оплатил). А отчётность в конце месяца соберут, схлопнув по id (кодам контрагентов), где уже подтянут актуальное наименование контрагента из НСИ в отчёт. Но в платёжке останется навечно старое кривое.

А если там была например смена организационно-правовой формы контрагента (со сменой id), для этого какраз и нужны связи Эталон-Дубликат в НСИ, чтобы учитывая их в отчётности, подтянуть проводки и платёжки со всех прошлых кодов контрагентов (если он в течении отчётного периода несколько раз менял ОПФ, и такое бывает).

Т.е. в любой момент для истории можно распечатать платёжку с фактическими кривыми реквизитами, ровно в том виде, как она была на момент её генерации. И правильный отчёт по оплаченным, с актуальными на сегодня реквизитами. В этом плюс избыточности хранения копии реквизитов НСИ в документе.
...
Рейтинг: 0 / 0
Как правльно создать таблицу пользователей двух типов в БД?
    #40083555
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stanislav Pчто влечёт за собой ну очень забавную переделку структуры БД.

Зачем? "Платёжка" просто сохраняется в системе как сгенерированный (и электронно
подписанный) PDF. Добавить одно поле - невелика переделка.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как правльно создать таблицу пользователей двух типов в БД?
    #40083707
Stanislav P
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov

Зачем? "Платёжка" просто сохраняется в системе как сгенерированный (и электронно
подписанный) PDF. Добавить одно поле - невелика переделка.

Сохраняется электронная версия (и это имеет место быть), которая ну никак не участвует в генерации различных отчетах основанных на информации в БД.
...
Рейтинг: 0 / 0
Как правльно создать таблицу пользователей двух типов в БД?
    #40084559
oragraf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jaketaylor,

Один директор может иметь несколько компаний.
...
Рейтинг: 0 / 0
Как правльно создать таблицу пользователей двух типов в БД?
    #40084626
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Директор - не может. Владелец/основатель может, но при этом у него другие заморочки.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
25 сообщений из 27, страница 1 из 2
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Как правльно создать таблицу пользователей двух типов в БД?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали тему (1): Анонимы (1)
Читали форум (1): Анонимы (1)
Пользователи онлайн (8): Анонимы (5), Bing Bot, Yandex Bot 1 мин., CerebroSQL 5 мин.
x
x
Закрыть


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