Дизайн базы данных для данного сценария - PullRequest
3 голосов
/ 14 января 2012

Я работаю над приложением, которое будет иметь 2 вида пользователей, преподавателей и студентов.

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

Помимо этих общих полей у студентов будет еще 4 поля: A, B, C и D.

Учителя будут иметь E, F и G.

Как лучше всего спроектировать базу данных для этого? Должен ли я использовать 2 таблицы (одну для студентов, одну для учителей, каждая со всеми полями) или 3 таблицы (пользовательскую таблицу - для общих полей, таких как имя пользователя и адрес электронной почты), а затем иметь отношения один-к-одному со студентами и таблицы преподавателей, которые содержат только определенные поля.

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

На самом деле я буду использовать hibernate для генерации таблиц из классов Java, поэтому с объектно-ориентированной точки зрения использование трех таблиц звучит лучше.

Я с нетерпением жду других мнений по этому вопросу.

Спасибо

Ответы [ 3 ]

1 голос
/ 14 января 2012
CREATE TABLE People
(
    PersonID      INTEGER NOT NULL PRIMARY KEY, -- Add local incantation for auto-allocated numbers
    FirstName     VARCHAR(32) NOT NULL,
    LastName      VARCHAR(32) NOT NULL,
    Email         VARCHAR(64) NOT NULL UNIQUE,
    UserName      VARCHAR(16) NOT NULL UNIQUE,
    PersonType    CHAR(1) NOT NULL CHECK(PersonType IN('S', 'T')) -- S student, T teacher
);

CREATE TABLE Student
(
    PersonID      INTEGER NOT NULL REFERENCES People,
    A             ...,
    B             ...,
    C             ...,
    D             ...
);

CREATE TABLE Teacher
(
    PersonID      INTEGER NOT NULL REFERENCES People,
    E             ...,
    F             ...,
    G             ...
);

Существует ограничение, которое требуется принудительно, чтобы столбец Teacher.PersonID ссылался на строку в People, где PersonType = 'T', и аналогично для Student.PersonID, ссылающейся на строку в People, где PersonType = 'S'. * 1004.*

Нет особо чистого способа обеспечить это автоматически.Вы можете добавить столбец PersonType для каждого учителя и ученика, который всегда будет содержать «T» или «S», а затем создать внешний ключ, который ссылается на People (PersonID, PersonType).Это некрасиво, потому что значение в таблице «Учитель» или «Студент» является постоянным, и поскольку один только PersonID уникален.

В противном случае вы применяете ограничения в коде.Вероятно, я бы использовал код, подкрепленный периодической проверкой, для записей, которые нарушают ограничение (записи в Teacher, которые идентифицируют ученика в таблице People, или записи в Student, которые идентифицируют учение в таблице People).

Насколько хорошо это отображается в Hibernate - это отдельная проблема.Возможно, вам пригодятся два представления:

CREATE VIEW StudentInfo AS
    SELECT P.*, S.A, S.B, SS.C, S.D
      FROM People AS P
      JOIN Student AS S
        ON P.PersonID = S.PersonID AND P.PersonType = 'S';

CREATE VIEW TeacherInfo AS
    SELECT P.*, T.E T.F, T.G
      FROM People AS P
      JOIN Teacher AS T
        ON P.PersonID = T.PersonID AND P.PersonType = 'T';

Конечно, вы можете убедительно утверждать, что ограничения на PersonType не нужны.

0 голосов
/ 14 января 2012

Hibernate (не менее 3.x) рекомендовал таблицу для каждой стратегии иерархии классов. Недостатком является то, что в каждой строке есть столбец для каждого поля в любом из подклассов, поэтому вы будете тратить немного места. Тем не менее это компенсирует этот недостаток в простоте.

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

0 голосов
/ 14 января 2012

Просто мнение. Я бы поместил все в одну таблицу, но создал бы несколько отображений Hibernate, используя наследование Hibernate и отображение «Таблица на иерархию классов»

http://docs.jboss.org/hibernate/core/3.3/reference/en/html/inheritance.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...