2012-03-11 41 views
0

我设计的数据库(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创建,那么这会是一个好主意吗? 以及实施此操作的最佳做​​法是什么?

谢谢你,

+0

没有直接关系,但有很大的帮助获得你的desicion的影响的感觉: http://blogs.tedneward.com/2006/06/26/The+Vietnam+Of+Computer+Science。 aspx – kamahl 2012-03-11 17:42:52

回答

0

有一些事情要考虑:

的员工可以客串,反之亦然? 如何比较它们?

如果这对你的应用程序起到了作用,我会考虑一个ParentTable,因为如果一个Employee也是一个Guest,你可以很容易地弄清楚。所以你可以轻松地比较它们。

另一方面,您可以做第三个选项: 一个称为个人信息的表。 雇员也有此参考,客人也有。 如果一位员工和一位来宾都回避相同的条目,则知道他们是同一个人。

模式:

是该模式是这样的:

表: PersonalInformation


ID(主键,自动增量)
,并把所有的信息在这里

表员工


ID(主键,自动INC INT)
PersonalInformation_ID(ForeignKey的到PersonalInformation.ID)
添加您的员工在这里特定的列

表客户


ID(主键, auto inc int)
PersonalInformation_ID(ForeignKey to PersonalInformation.ID)
在此处添加您的访客特定列

希望这可以帮助你实现它,否则再问一次。

+0

我认为第三种选择会更合适。任何建议来实现这个? – Sasha 2012-03-11 19:06:06

+0

看到更新后! – kamahl 2012-03-13 18:48:35