2015-08-11 5 views
1

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

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

  1. художники
  2. автомобиля Detailers
  3. много бабок
  4. обслуживание техники:
    1. двигатель технический
    2. техники передачи
    3. компьютерной техники
    4. электриков
  5. торговый представитель
    1. физический торговый представитель расположение
    2. Интернет торговый представитель
    3. менеджер по продажам

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

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

enter image description here

ответ

0

Ваш дизайн пристойно. Мне это нравится. Поместите в него некоторые данные и напишите несколько запросов. Вы можете нормализовать его немного больше, если захотите. Вот 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); 

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