Должен ли я создать родительскую таблицу для общих атрибутов? - PullRequest
0 голосов
/ 11 марта 2012

Я проектирую базу данных (MySQL), в которой у меня есть две таблицы «Сотрудники» и «Гости» следующим образом:

CREATE TABLE employee (
`EMP_ID` INT UNSIGNED NOT NULL AUTO_INCREMENT,
 `FIRST_NAME` VARCHAR(8) NOT NULL,
 `MID_NAME` VARCHAR(11), 
`LAST_NAME` VARCHAR(8) NOT NULL,
 `BIRTHDAY` DATE,
 `COUNTRY_ID` INT, 
`NAT_ID` VARCHAR(8) NOT NULL,
 `ID_EXP_DATE` DATE,
 `ID_TYPE` VARCHAR(8) NOT NULL,
 `Mobile` VARCHAR(8) NOT NULL,
 `PHONE` VARCHAR(8) NOT NULL, 
`EMAIL` VARCHAR(27) NOT NULL,
 `DEPT_ID` TINYINT NOT NULL references DEPARTMENT (ID), 
`POSITION` VARCHAR(20), 
`EMP_TYPE` TINYINT NOT NULL references EMP_TYPES (type),
 `JOINDATE` DATE,
 `SALARY` MEDIUMINT DEFAULT 0 ,
 `WORKEMAIL` VARCHAR(30), 
`MARITALSTAT` VARCHAR(7),
 `EMERGCONTACT` VARCHAR(22),
 `EMERG_CONT_PHN` VARCHAR(11), 
`GENDER` VARCHAR(6),
 `RESUMEURL` VARCHAR(60),
 `RELIGION` VARCHAR(11), 
PRIMARY KEY (`EMP_ID`));

CREATE TABLE Guest (
`guest_ID` INT UNSIGNED NOT NULL AUTO_INCREMENT,
 `FIRST_NAME` VARCHAR(8) NOT NULL, 
`MID_NAME` VARCHAR(11),
 `LAST_NAME` VARCHAR(8) NOT NULL, 
`BIRTHDAY` DATE, 
`COUNTRY_ID` INT,
 `NAT_ID` VARCHAR(8) NOT NULL, 
`ID_EXP_DATE` DATE, 
`ID_TYPE` VARCHAR(8) NOT NULL,
 `Mobile` VARCHAR(8) NOT NULL, 
`PHONE` VARCHAR(8) NOT NULL, 
`EMAIL` VARCHAR(27) NOT NULL, 
`WORKEMAIL` VARCHAR(30),
 `MARITALSTAT` VARCHAR(7), 
`EMERGCONTACT` VARCHAR(22),
 `EMERG_CONT_PHN` VARCHAR(11),
 `GENDER` VARCHAR(6),
`RELIGION` VARCHAR(11),
..................................// More attributes specific for guest table
 PRIMARY KEY (`Guest_ID`));

Поскольку обе таблицы имеют автоматически сгенерированные первичные ключи, и было бы неуместно, если бы они использовали первичный ключ от лица. было бы хорошей идеей создать таблицу с именем person со всеми общими атрибутами и двумя дочерними таблицами как Employee и Guest? и что было бы наилучшей практикой для реализации этого?

Спасибо,

1 Ответ

0 голосов
/ 11 марта 2012

Есть несколько моментов, на которые следует обратить внимание:

Может ли сотрудник быть гостем или наоборот?Как их сравнить?

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

С другой стороны, вы можете сделать третий вариант: Таблица под названием Личная информация.Сотрудник имеет ссылку на это, гости также.Если Сотрудник и Гость ссылаются на одну и ту же запись, вы знаете, что это один и тот же человек.

Схема:

Да, схема выглядит так:

Таблица: PersonalInformation


ID (первичный ключ, auto inc)
И поместите всю свою информацию здесь

Таблица сотрудника


ID (первичный ключ, auto inc)int)
PersonalInformation_ID (ForeignKey to PersonalInformation.ID)
Добавьте сюда столбцы, специфичные для вашего сотрудника

Таблица Guest


ID (первичный ключ, auto inc int)
PersonalInformation_ID (ForeignKey to PersonalInformation.ID)
Добавьте сюда столбцы, специфичные для вашего гостя

Надеюсь, это поможет вам реализовать его, в противном случае повторите запрос.

...