2015-10-26 4 views
0

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

Type 1 : Administrator 
- Name 
- Lastname 
- Email 
- Password 

Type 2: Student 
- Name 
- Lastname 
- Email 
- Password 
- Status 
- Sex 
- Among other type of personal information fields 

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

Что было бы наиболее эффективным способом для этого? . Спасибо за ваше время

ответ

0

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

Вы должны иметь User таблицу с этими столбцами:.

Id, Name, Lastname, Email, Password, IsAdmin

с студенческого стола:

UserId, Status, Sex, ...

A Student также должен быть User - это уменьшит дублирование данных.

Если вам нужно больше разрешений, чем IsAdmin, тогда удалите эту колонку и сделайте таблицы UserPermissions и Permission.

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

0

Администратор - это роль, которую играет человек.

Студент - это роль, которую играет человек.

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

Используйте single table inheritance, чтобы разрешить разные типы ролей в одной таблице.

create table people (
    person_id int primary key, 
    given_name varchar(...), 
    surname varchar(...), 
    password varchar(...)--consider a `users` table instead 
); 

create table roles (
    role_id int primary key, 
    person_id int not null references people(person_id), --use the long-hand foreign key syntax for mysql 
    type varchar(...), --admin or student 
    status varchar(...), --consider PostgreSQL over mysql, as it supports check constraints 
    sex varchar(...) 
);