LINUX.ORG.RU

Как правльно создать таблицу пользователей двух типов в БД?

 ,


0

1

Проектируется БД. На сайте должно быть типы аккаунтов со столбцами, перечисленными в скобках:

  • Физическое лицо (фамилия, имя, email, password);
  • Юридическое лицо (фамилия, имя, email, password + название компании, УНП компании).

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

https://i.ibb.co/mR7wZ8B/Untitled.jpg

либо создать только одну таблицу accounts и там, где у юзера будет роль = «Физическое лицо» заполнятся null поля, которые должны быть заполнены у компании, а это поля название компании, УНП компании?


Две таблички делай и форейн ключ по ІД юзера.

Первая таблица: id, first name, last name, email, password, type/role Вторая таблица: id, company, upn

По ID можешь привязать компанию к юзеру, а по type/role фильтровать потом.

PunkoIvan
()

Юр. лицо - это не физ. лицо. У них общего - только слово «лицо». Директора юр.лица появляются и исчезают. Так же и юр. лица закрываются и открываются на одних и тех же людей. И я тебе даже больше скажу, фио может меняться и его update делать нельзя.

crutch_master
()
Последнее исправление: crutch_master (всего исправлений: 1)
Ответ на: комментарий от crutch_master

Первая таблица users (id, first_name, last_name, email, password, role, type)

Вторая таблица companies(id, name, unp)

Третья таблица employees(id, user_id, company_id)

n199a
() автор топика
Ответ на: комментарий от n199a

Паспортные данные отдельно с датами актуальности (или вообще в отдельной сертифицированной бд и это - НЕ mysql, см закон о ПД) Роли - отдельная таблица. Ну, если у тебя это - не студ. поделка.

crutch_master
()

создать только одну таблицу accounts и там, где у юзера будет >роль = «Физическое лицо» заполнятся null поля, которые должны >быть заполнены у компании,

Вот это.

Кроме того, можно полюбоваться примерами оверинжиниринга.

Psilocybe 👍👍
()
Ответ на: комментарий от Psilocybe

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

CREATE TABLE account_roles (
    role_id TINYINT UNSIGNED NOT NULL UNIQUE AUTO_INCREMENT PRIMARY KEY,
    role_name ENUM('administrator', 'company', 'guest')
);

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

CREATE TABLE accounts (
    account_id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
    account_login VARCHAR(50) NOT NULL UNIQUE,
    account_email VARCHAR(70) NOT NULL UNIQUE,
    account_password_hash VARCHAR(255) NOT NULL,
    role_id TINYINT UNSIGNED NOT NULL,
    status_id TINYINT UNSIGNED NOT NULL,
    FOREIGN KEY (role_id) REFERENCES account_roles(role_id),
    FOREIGN KEY (status_id) REFERENCES account_statuses(status_id)
);

CREATE TABLE companies (
    company_id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
    company_name VARCHAR(150) NOT NULL UNIQUE,
    company_address VARCHAR(200) NOT NULL,
    company_unp TINYINT UNSIGNED NOT NULL UNIQUE,
    account_id BIGINT UNSIGNED NOT NULL UNIQUE,
    FOREIGN KEY (account_id) REFERENCES accounts (account_id)
);
n199a
() автор топика

Какие должны быть таблицы тогда в БД?

На самом деле какие угодно. Вариант с одной таблицей имеет свои плюсы.

no-such-file 👍👍👍👍👍
()
Ответ на: комментарий от n199a

У одной компании может быть n сотрудников по идее. А у сотрудника n ролей, если эти роли не ограничиваются 'admin','company','guest'
Короче без предметной области это всё так себе советы.

crutch_master
()
Ответ на: комментарий от n199a

В предложеном варианте как минимум неточность в

    company_id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
);

Тут AUTO_INCREMENT лишнее. Генерация ид должна быть в одном месте.

А так, чтобы ответить на вопрос нужно или нет разделять аккаунты на части в зависимости от категории клиента ответь на вопросы:

  • нужны ли отдельные выборки или отдельные джойны по отдельным категориям?
  • нужны ли выборки или джойны вне зависимости от категории?
  • возможно ли ссылки только на физиков или только на юриков, то есть ссылочная целостность по отдельным категориям?
  • возможны ли ссылки на клиентов вне зависимости от их категории?

В зависимости от ответов будет выбор одного из вариантов:

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

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

Psilocybe 👍👍
()
Ответ на: комментарий от no-such-file

Есть какой-то сакральный смысл в таблицах для статусов и ролей?

Разделение логики по принципам ООП.

n199a
() автор топика
Ответ на: комментарий от Psilocybe

Тут AUTO_INCREMENT лишнее. Генерация ид должна быть в одном месте.

Так это же генерация id компаний, всё верно же.

За развернутый ответ отдельная благодарность.

n199a
() автор топика
Ответ на: комментарий от n199a

Так это же генерация id компаний, всё верно же.

Точно, перепутал с account_id

Psilocybe 👍👍
()

А я бы начал с тех объектов которые будут использоваться в коде при работе с этими лицами и уже потом думал бы о том как это должно быть в базе для эффективности запросов.

TDrive
()
Ответ на: комментарий от n199a

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

UPD: А ну в принципе у тебя там и есть полиморфная связь но размазанная по таблицам и какая то кривая…

TDrive
()
Последнее исправление: TDrive (всего исправлений: 1)
Ответ на: комментарий от n199a

Короче, там можно было бы увидеть Single Responsibility но в таком случае account_id в таблице companies лишний) Таска на изменение системы аккаунтов затронет реализацию компаний, SRP нарушается.)

TDrive
()
Ответ на: комментарий от TDrive

но в таком случае account_id в таблице companies лишний

А как тогда в таблицу companies привязать пользователя?)

n199a
() автор топика
Ответ на: комментарий от TDrive

Таска на изменение системы аккаунтов

Это какую команду вы имеете ввиду и что понимаете под понятием «система аккаунтов»?)

n199a
() автор топика
Ответ на: комментарий от n199a

А как тогда в таблицу companies привязать пользователя?)

как угодно, можно через связывающую таблицу, можно в самих аккаунтах указывать связь в формате table_name+PK

Это какую команду вы имеете ввиду и что понимаете под понятием «система аккаунтов»?)

таблица аккаунтов вероятно существует не сама по себе, есть какая нибудь моделька если там MVC какой нибудь. Есть объекты которые работают с этой моделькой. И вот когда менеджеры попросят изменить все это под новые фичи эти изменения не должны затрагивать список компаний, новостную ленту или воронку продаж… Single Responsibility именно про это.

TDrive
()
Последнее исправление: TDrive (всего исправлений: 1)

У юридического лица нет таких атрибутов как фамилия и email. Там юридический адрес (регион, город, улица, дом, офис или вообще квартира), ИНН, ОГРН, ОКПО, название банка, корр. счет, генеральный директор, учредители, которые могут быть как физическими лицами так и юридическими… Ты какую-то хрень придумываешь

tz4678
()

У тебя должна быть таблицs users (id, username, email, password, …) и companies (id, name, …) у компании есть форма собственности (ИП, ООО, АО и тп) + третья таблица user_companies (id, user_id, company_id, название должности). Один человек может быть формлен как самозанятый (упрощенное налогооблажение), ИП и быть гендиром, учредителем в куче компаний. У тебя тимлид 23-летний чмошник на самокате?

tz4678
()
Последнее исправление: tz4678 (всего исправлений: 1)
Ответ на: комментарий от tz4678

Дополнительные атрибуты компании, так как у разных форм собственности разное их количество, просто храни в виде сериализованной структуры (json)

tz4678
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.