我想我应该首先解释一下系统实际做了什么才能更好地理解。
该系统是一个工资单查看器网站,其中上传者(人事人员)以excel格式上传一堆工资单,这些条目将保存到数据库中。然后,工资单查看器会提取当前登录用户的emp_id
,并显示其所有earnings, deductions, info
及其总earnings(all earnings are added), total deductions(all deductions are added) and netpay(total earning-total deduction)
。
我的问题是,我的教授说我需要“规范化”表格,但我想知道我怎么可能将其正常化,因为我认为这是“正常化”的。但是,我确实试图创建两个erds,但我有几个问题:
我的第一个ERD:
我的第二个ERD:
(我这样做是为了尝试并将其标准化,但是对于系统的要求,我认为这不合适)
答案 0 :(得分:1)
据我所知,你看起来很接近,你只需要将扣除和收入表中的关系改为一对多,并删除所有多余的“收入”和“扣除”列,留下你以下内容:
通过这种方式,您可以根据需要获得与薪资单相关的收入记录和扣减记录。
答案 1 :(得分:0)
我的猜测是你的教授要你没有30个扣除字段。就像......当你设置一张桌子并发现自己在做的时候:
object_typa_1 | object_typa_2 | object_typa_3 | object_typa_4 | object_typeb_1 | object_typeb_2 ..
将值存储在各自的字段中。相反,你应该规范化,以防有一天你必须添加deduction31
,你不必做一个ALTER TABLE和schluff你的所有SQL来容纳。
相反:
Object Table:
type | number | value
在你的情况下:
employees:
emp_id | password | name | ...
payslips:
id | emp_id | other payslip attributes | ...
payslip_items:
payslip_id | type | number | value
在payslip_items表中,您可以为每个工资单保留多个记录。您告诉它该项目是type
字段中的收入还是扣除。你说它在number
字段中的收益或扣除...可能不是最好的名字,但是例如好。然后是value
字段中获得/扣除的价值。所以实际上你的payslip_items表将是每个工资单的34条记录(30个扣除和4个收入)...
您希望这样做的原因是,在现实世界中,只要您为客户/业务合作伙伴启动此项服务,他们就会想要为薪资单添加新的扣减或收入(保证)。这种模式有效,因为您不必使用ALTER TABLE并弄乱所有处理payslip_items的sql。它会根据您的需要增长和缩小。
答案 2 :(得分:-1)
我认为下表结构可以解决您的问题。
CREATE TABLE `Emp` (
`id` int NOT NULL,
`name` varchar(100) NOT NULL,
`password` varchar(255) NOT NULL,
`user_type` varchar NOT NULL,
PRIMARY KEY (`id`)
);
CREATE TABLE `payslip_map` (
`id` INT NOT NULL AUTO_INCREMENT,
`emp_id` INT NOT NULL,
`payslip_id` INT NOT NULL,
PRIMARY KEY (`id`)
);
CREATE TABLE `payslips` (
`id` INT NOT NULL,
`particular_id` INT NOT NULL,
`amt` FLOAT NOT NULL
);
CREATE TABLE `particulars` (
`id` INT NOT NULL AUTO_INCREMENT,
`particulars` varchar(80) NOT NULL UNIQUE,
`is_earning` BOOLEAN NOT NULL,
PRIMARY KEY (`id`)
);
ALTER TABLE `payslip_map` ADD CONSTRAINT `payslip_map_fk0` FOREIGN KEY (`emp_id`) REFERENCES `Emp`(`id`);
ALTER TABLE `payslip_map` ADD CONSTRAINT `payslip_map_fk1` FOREIGN KEY (`payslip_id`) REFERENCES `payslips`(`id`);
ALTER TABLE `payslips` ADD CONSTRAINT `payslips_fk0` FOREIGN KEY (`particular_id`) REFERENCES `particulars`(`id`);