Дизайн базы данных с типами и подтипами

Я пытаюсь создать базу данных с супертипом/подтипом. У меня есть следующие пользователи:
- обычный пользователь
- бизнес-пользователь
- администратор (привилегированный пользователь).

Все три пользователя имеют общую таблицу (пользователей), в которой хранятся такие поля, как имя, адрес электронной почты, пароль и т. д. Однако у бизнес-пользователей есть отдельная таблица (business), в которой хранятся бизнес-поля, такие как business_name, business_license, business_email и т. д. Моя проблема в том, что мои бизнес-пользователи сами делятся на 5 или более категорий.
Мои бизнес-пользователи делятся следующим образом:

  1. художники
  2. Детейлеры автомобилей
  3. служители участка
  4. service technicians:
    1. engine technicians
    2. специалисты по трансмиссии
    3. компьютерщики
    4. электрики
  5. sales representatives
    1. physical location sales representative
    2. представитель интернет-торговли
    3. менеджер по продажам

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

В настоящее время я разработал эту базу данных, но я не очень доволен ею. Есть ли лучший подход?

введите здесь описание изображения


person Cristian    schedule 11.08.2015    source источник


Ответы (1)


Ваш дизайн достойный. Мне это нравится. Поместите в него некоторые данные и напишите несколько запросов. Вы можете нормализовать его немного больше, если хотите. Вот SQLFiddle, с которым вы можете поиграть http://sqlfiddle.com/#!9/b0711/3 и ниже приведены операторы.

Пользователи и типы

create table usertypes (id int, typename varchar(100));
insert into usertypes values (1,'Basic'), (2, 'Business'), (3, 'Super');

create table users (
  id int, 
  email varchar(100), usertype int, fullname varchar(100)
);
insert into users values 
(1, '[email protected]', 1, 'Tom Basic'),
(2, '[email protected]', 2, 'Bill Business'),
(3, '[email protected]', 3, 'Charlie Super');

-- USERS will have SUBTYPES in this many to many table. This will allow
-- a user to be a part of multiple subtypes if you please. You can control
-- that. If userid is primary key, one user can be of only one subtype
-- If userid and usertype make up a composite primary key, a user can be
-- of multiple types
create table userstypes (userid int, usertype int);
insert into userstypes values (1, 1), (2, 2), (3, 3);

Компании и пользователи

create table businesses (
  id int,
  doing_business_as varchar(100), phone varchar(30)
);
insert into businesses values (1, 'Microsoft', '111-222-3333');
insert into businesses values (2, 'Toms Hardware', '111-222-3333');

-- Same as user types
-- DANGER: if you mark a user to be of type 'Basic', nothing stops that
-- user to have a business. You can use a trigger to allow only business
-- user to have an entry here
create table usersbusinesses (userid int, businessid int);
insert into usersbusinesses values (1,2), (2, 1);  

Подтипы бизнеса

create table businesstypes (id int, businesstypename varchar(100));
insert into businesstypes values (1, 'Software'), (2, 'Hardware');

create table businessestypes (businessid int, businesstypes int);
insert into businessestypes values (1, 1), (2, 2);

-- DANGER: This design allows only 1 level of subtype. If a business
-- has a subtype, and that subtype has a sub-subtype and so on, this
-- design will not scale. Hierarchical design will scale but may also 
-- need performance tuning
create table businesssubtypes (id int, businesssubtypename varchar(100));
insert into businesssubtypes values (1, 'Garden Tools'), (2, 'Heavy Machine');

create table businesstypes_subtypes (businessid int, businesssubtypeid int);
insert into businesstypes_subtypes values (2,2);

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

person zedfoxus    schedule 11.08.2015