我正在设计数据库(MySQL),其中有两个表Employees和Guests如下:
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? 什么是实施这个的最佳实践?
谢谢,
答案 0 :(得分:0)
有些事情需要考虑:
员工可以是客人,反之亦然? 如何比较它们?
如果这对您的应用程序起作用,我会考虑使用ParentTable,因为如果员工也是来宾,您可以轻松搞清楚。所以你可以很容易地比较它们。
另一方面,你可以做第三个选择: 一个叫做个人信息的表。 员工也有参考,客人也。 如果员工和访客都拒绝参加相同的条目,您就知道他们是同一个人。
架构:
是架构如:
表: 个人信息
ID(主键,auto inc)
并将您的所有信息放在这里
表员工
ID(主键,auto inc int)
PersonalInformation_ID(ForeignKey to PersonalInformation.ID)
在此处添加您的Employee特定列
表访客
ID(主键,auto inc int)
PersonalInformation_ID(ForeignKey to PersonalInformation.ID)
在此处添加您的Guest特定列
希望这有助于您实施,否则请再次询问。