s***u 发帖数: 41 | 1 有一个Employee table,很多栏(field),包含了职员的基本信息和这个职员的badge
的信息。(见附件插图和下面的 table)
CREATE TAbLE Employee
{
emplLastName varchar(30) ,
emplFirstName varchar(30) ,
emplNickname varchar(20) ,
emplCategory varchar(2) ,
emplCampID varchar(10) ,
emplArea varchar(10) ,
emplDepartment varchar(20),
emplTitle varchar(50) ,
emplEmployeeID varchar(9),
emplCardNumber varchar(16),
emplActive tinyint(4) ,
emplComment longtext,
emplRecycleDate datetime,
emplBadge1 varchar(30) ,
emplBadge2 varchar(30) ,
emplBadge3 varchar(30) ,
emplBadgeDate datetime ,
emplBadgeSend tinyint(4) ,
emplType int(10) ,
emplCompleteDate datetime,
emplIndexSent datetime ,
emplSupervisor varchar(50),
emplyBadgeReturn tinyint(4) ,
emplyReprintRtrn tinyint(4) ,
emplautonumber int(10)
}
请问大家如何把这个Employee table重新设计,设计成至少有一个Employee table, 一
个badge table, 并且把它们关联起来。(Normalization the original big employee
table)
大家能不能给我一些指点,该怎么重新设计这个database schema呀?
谢谢。 | a9 发帖数: 21638 | 2 加个自增长id列喽
badge
employee
【在 s***u 的大作中提到】 : 有一个Employee table,很多栏(field),包含了职员的基本信息和这个职员的badge : 的信息。(见附件插图和下面的 table) : CREATE TAbLE Employee : { : emplLastName varchar(30) , : emplFirstName varchar(30) , : emplNickname varchar(20) , : emplCategory varchar(2) , : emplCampID varchar(10) , : emplArea varchar(10) ,
| s***u 发帖数: 41 | 3 请问如何把这个大表格如何重新设计呀。这是一个badge database sytem for all
employees. 我想把employee, 和badge信息分开来。可是就是理不清该怎么设计起来
。(我还是数据库方面的入门级别都不到,就知道一些概念而已。)。 感谢大家指点
一下。谢谢。 | w****u 发帖数: 3147 | 4 晕。。。弄个子表,外键链起来
【在 s***u 的大作中提到】 : 请问如何把这个大表格如何重新设计呀。这是一个badge database sytem for all : employees. 我想把employee, 和badge信息分开来。可是就是理不清该怎么设计起来 : 。(我还是数据库方面的入门级别都不到,就知道一些概念而已。)。 感谢大家指点 : 一下。谢谢。
| s***u 发帖数: 41 | 5 是要建立三个表格吗,一个把employee表格(其中有一栏employeeID) , 一个badge表
格(其中有一栏badgeID),然后再一个employeeBadge表格把这两个表格链接起来(
employeeID, badgeID)。
那个大employee表格里,哪些field适合放进新的employee表格,哪些适合放进badge表
格呢?
知道我的问题对大家来说,肯定太简单,可惜我太菜鸟,不太明白你们说的什么意思。
请问可以说得具体详细一些吗?帮我把整个database schema 写出来,那就太好啦。谢
谢:-) | B*****g 发帖数: 34098 | 6 一个badge可以被几个人拥有?
【在 s***u 的大作中提到】 : 是要建立三个表格吗,一个把employee表格(其中有一栏employeeID) , 一个badge表 : 格(其中有一栏badgeID),然后再一个employeeBadge表格把这两个表格链接起来( : employeeID, badgeID)。 : 那个大employee表格里,哪些field适合放进新的employee表格,哪些适合放进badge表 : 格呢? : 知道我的问题对大家来说,肯定太简单,可惜我太菜鸟,不太明白你们说的什么意思。 : 请问可以说得具体详细一些吗?帮我把整个database schema 写出来,那就太好啦。谢 : 谢:-)
| s***u 发帖数: 41 | 7 Beijing MM:
太谢谢你有心帮助我呀!
唉,怎么回答你的问题呢,这个badge系统里有好几种badge卡,比如:
badge for staff
badge for vendor
badge for guests
temp cards
。。。
给staff的卡,基本是一个人一个卡,除非卡掉了,再重新申请新的卡;
badge for vendor, 那就是一个卡,给那个vendor公司的几个人共用;
badge for guests,一个卡,给一个人用,用完了返回,下次给另外一个人用;
一个staff ,可以有 staff badge (for go to his office);但是如果因为工作需要,
想去另外不同的building,就有可能有另外一个badge (but for different building
area)....
目前,所有的信息都是用一个大表格装下来,很乱。(比如vendor,系统里就把某个办公室列为其名字,然后很多“Employee"信息都不输入进去,--因为他们不是Employee,没有那些信息----但是系统还是把他们当作Employee处理)
该怎么把这个系统重新设计更合理呢?我感觉很有些混乱。请给我一些详细指点吧。
非常非常感谢! | p*********t 发帖数: 2690 | 8 1个employee可以有3个badge;1个badge只能有一个employee吗?
按说狠简单啊,连normalization 1nf,2nf之类的都不需要,只有2个entity.
badge
【在 s***u 的大作中提到】 : 有一个Employee table,很多栏(field),包含了职员的基本信息和这个职员的badge : 的信息。(见附件插图和下面的 table) : CREATE TAbLE Employee : { : emplLastName varchar(30) , : emplFirstName varchar(30) , : emplNickname varchar(20) , : emplCategory varchar(2) , : emplCampID varchar(10) , : emplArea varchar(10) ,
| p*********t 发帖数: 2690 | 9 employee和badge之间是什么关系,是1对n,还是n对1,还是n对n? 只有n对n的时候才要
一个bridge table.
【在 s***u 的大作中提到】 : 是要建立三个表格吗,一个把employee表格(其中有一栏employeeID) , 一个badge表 : 格(其中有一栏badgeID),然后再一个employeeBadge表格把这两个表格链接起来( : employeeID, badgeID)。 : 那个大employee表格里,哪些field适合放进新的employee表格,哪些适合放进badge表 : 格呢? : 知道我的问题对大家来说,肯定太简单,可惜我太菜鸟,不太明白你们说的什么意思。 : 请问可以说得具体详细一些吗?帮我把整个database schema 写出来,那就太好啦。谢 : 谢:-)
| s***u 发帖数: 41 | 10 protagonist:
谢谢你的问题。请看我上面给beijing mm的回答。你说我上面说的那种情况算是n对n吗
?具体该怎么设计呢?谢谢! | | | a9 发帖数: 21638 | 11 你不懂咋让你设计呢。你这是让别人给你干活了嘛。
是不是设计好了,下一步就该问怎么实现了。
【在 s***u 的大作中提到】 : protagonist: : 谢谢你的问题。请看我上面给beijing mm的回答。你说我上面说的那种情况算是n对n吗 : ?具体该怎么设计呢?谢谢!
| w***a 发帖数: 313 | 12 TABLE employees
emplLastName varchar(30) ,
emplFirstName varchar(30) ,
emplNickname varchar(20) ,
emplCategory varchar(2) ,
emplCampID varchar(10) ,
emplArea varchar(10) ,
emplDepartment varchar(20),
emplTitle varchar(50) ,
emplEmployeeID varchar(9),
emplCardNumber varchar(16),
emplActive tinyint(4) ,
emplComment longtext,
emplRecycleDate datetime,
emplType int(10) ,
emplCompleteDate datetime,
emplIndexSent datetime ,
emplSupervisor varchar(50),
emplyReprintRtrn tinyint(4) ,
emplautonumber int(10)
TABLE empl_badg
empl_badgIssueDate
empl_badgReturnDate
emplEmployeeID
badgBadgeID
TABLE badges
badgBadgeID varchar(30) ,
badgStatus varchar(30) , (active, deactived, expired, lost ...etc)
badgType varchar(30) , (staff, guest, vendor etc)
badgExpireDate datetime ,
上边三个表就可以了,visitor,vendor省事点的做法是也放到employee表里,用员工类
型区分就可以了。
【在 s***u 的大作中提到】 : Beijing MM: : 太谢谢你有心帮助我呀! : 唉,怎么回答你的问题呢,这个badge系统里有好几种badge卡,比如: : badge for staff : badge for vendor : badge for guests : temp cards : 。。。 : 给staff的卡,基本是一个人一个卡,除非卡掉了,再重新申请新的卡; : badge for vendor, 那就是一个卡,给那个vendor公司的几个人共用;
| B*****g 发帖数: 34098 | 13 ding
【在 w***a 的大作中提到】 : TABLE employees : emplLastName varchar(30) , : emplFirstName varchar(30) , : emplNickname varchar(20) , : emplCategory varchar(2) , : emplCampID varchar(10) , : emplArea varchar(10) , : emplDepartment varchar(20), : emplTitle varchar(50) , : emplEmployeeID varchar(9),
| g***l 发帖数: 18555 | 14 这个明显的不是3RD NORMAL FORM,连BADGE1 BADGE2都出来了,重复的GROUP.连1 NORMAL
FORM都不是.明显地是三个TABLE,需要个EMPLOYEE_ID的KEY
EMPLOYEE TABLE
(
EMPLOYEE_ID primary key ,
EMPLOYEE_NAME,
any employee information, must be 1 to 1 from employee_id
)
BADGE TABLE
(
BADGE_ID primary key,
BADGE RETURNED DATA
ANY BADGE RELATED INFO, MUST BE 1 TO 1 FROM BADGE_ID
)
EMPLOYEE_BADGE TABLE
(
EMPLOYEE_ID,
BADGE_ID
) PRIMARY KEY IS BOTH | s***u 发帖数: 41 | 15 非常感谢wanna和 gejkl出面抛钻引玉。。。任何建议都让我很感激。
-------------------------------------------------------
gejkl:
你说"连BADGE1 BADGE2都出来了", 对不起,我在这里解释一下,在原表格EMPLOYEE
里的三个field (对应那个图片里的Badge1 ,Badge12, Badge3):
emplBadge1 varchar(30) ,
emplBadge2 varchar(30) ,
emplBadge3 varchar(30) ,
不是指员工有三个Badge,而是这三个field是用来存制作BADGE的信息的,比如
emplBadge1 :shaou
emplBadge2: staff
emplBadge3 : kenney Hall
(以上的信息是用来打印到Badge上的)。 | g***l 发帖数: 18555 | 16 说的就是这个,如果你看看DATABASE的书,1ST NORMAL FORM就是去除REPEATING GROUP
,就是这个BADGE1, BADGE2, BADGE3
EMPLOYEE
【在 s***u 的大作中提到】 : 非常感谢wanna和 gejkl出面抛钻引玉。。。任何建议都让我很感激。 : ------------------------------------------------------- : gejkl: : 你说"连BADGE1 BADGE2都出来了", 对不起,我在这里解释一下,在原表格EMPLOYEE : 里的三个field (对应那个图片里的Badge1 ,Badge12, Badge3): : emplBadge1 varchar(30) , : emplBadge2 varchar(30) , : emplBadge3 varchar(30) , : 不是指员工有三个Badge,而是这三个field是用来存制作BADGE的信息的,比如 : emplBadge1 :shaou
| p*********t 发帖数: 2690 | 17 emplBadge1 :shaou
emplBadge2: staff
emplBadge3 : kenney Hall
这样啊?最好每个badge有一个badge number/id,用过的badge number/id最好就别再用
了,人走了或者badge不用了,badge number/id就作废了,新来的就用一个新的badge
number/id,这样能避免新人和走的人的数据混在一起.
badge number/id的可能的最大数是多少?以此来决定badge number/id至少要几位数。
如果是这样的话,
badge TABLE {
BadgeId,
emplBadge1,
emp1Badge2,
emplBadge3
}
如果是一个员工一个badgeId的话,只要2个table (employee, badge)就行了,连
bridge table都不用。
具体员工和badge之间是1对1,1对n,n对1,还是n对n,那就要你自己搞清楚了。如果不
清楚,最好向老板请示,千万别自作主张,到时候出错就麻烦了。
EMPLOYEE
【在 s***u 的大作中提到】 : 非常感谢wanna和 gejkl出面抛钻引玉。。。任何建议都让我很感激。 : ------------------------------------------------------- : gejkl: : 你说"连BADGE1 BADGE2都出来了", 对不起,我在这里解释一下,在原表格EMPLOYEE : 里的三个field (对应那个图片里的Badge1 ,Badge12, Badge3): : emplBadge1 varchar(30) , : emplBadge2 varchar(30) , : emplBadge3 varchar(30) , : 不是指员工有三个Badge,而是这三个field是用来存制作BADGE的信息的,比如 : emplBadge1 :shaou
| s***u 发帖数: 41 | 18 谢谢protagonist ,gejkl, wanna ,谢谢你们的建议。
我会听从你们的建议,好好问清这badge与employee之间的关系。
谢谢大家 | g***l 发帖数: 18555 | 19 应该是多对多,一个EMPLOYEE有多个,比如回头客,肯定换了BADGE,同样的BADGE又被
不同的EMPLOYEE用,比如前一个被LAYOFF,后来又雇了一个,把同样的BADGE给了下一
个人,这个要看公司怎么操作,原则是应该是一对一的关系,一个人一个BADGE,不能
SHARE不能重复使用, | w***a 发帖数: 313 | 20 按我们公司来说,正式员工一般情况是一对一,因为badge上有照片的,不能换用。
临时badge没照片,是一对多,可以随意用。
要是统一考虑,还是都按一对多来设计比较好
【在 g***l 的大作中提到】 : 应该是多对多,一个EMPLOYEE有多个,比如回头客,肯定换了BADGE,同样的BADGE又被 : 不同的EMPLOYEE用,比如前一个被LAYOFF,后来又雇了一个,把同样的BADGE给了下一 : 个人,这个要看公司怎么操作,原则是应该是一对一的关系,一个人一个BADGE,不能 : SHARE不能重复使用,
| | | p*********t 发帖数: 2690 | 21 re
按照lz的说法,badge上有名字等个人信息,layoff之后新人不可能再戴这个badge.
【在 w***a 的大作中提到】 : 按我们公司来说,正式员工一般情况是一对一,因为badge上有照片的,不能换用。 : 临时badge没照片,是一对多,可以随意用。 : 要是统一考虑,还是都按一对多来设计比较好
| B*****g 发帖数: 34098 | 22 对,badge是一个,功能不一样,有的只能开大门,有的连datacenter都能进去
又被
下一
不能
【在 w***a 的大作中提到】 : 按我们公司来说,正式员工一般情况是一对一,因为badge上有照片的,不能换用。 : 临时badge没照片,是一对多,可以随意用。 : 要是统一考虑,还是都按一对多来设计比较好
| p*********t 发帖数: 2690 | 23 恩,現在公司的badge,一般都有照片,名字,还有磁条,公司的门都是刷卡才能进的了。
【在 B*****g 的大作中提到】 : 对,badge是一个,功能不一样,有的只能开大门,有的连datacenter都能进去 : : 又被 : 下一 : 不能
| s***u 发帖数: 41 | 24 谢谢大家还在讨论这个话题。
我刚才run query了解了一下,总共有7344个记录,这个数据库没有primary key :
有166人有两个或者两个以上的badge;
一个badge number就只对应一个人。
但是因为系统记录的历史原因,有些员工的信息不全:
有653人并没有badge number (653个 人的badge number is null);
有586 人没有 Employee ID (586 个 人的employeeID number is null);
有216 人两个信息都没有 (badge number is null, employeeID number is null)
我现在就在想如何处理这些信息不全的人(系统里有他们的职员信息,但是没有badge信
息;或者系统里有他们的badge信息,但是没有职员信息;如果对于两样信息都没有的,
我打算把他们当作 invalid的数据处理算了。)可是怎么处理前面那两种情况呢?
大家有什么建议?
谢谢. |
|