如何规范化表格

时间:2015-03-20 17:43:51

标签: mysql normalization data-modeling

我想我应该首先解释一下系统实际做了什么才能更好地理解。

该系统是一个工资单查看器网站,其中上传者(人事人员)以excel格式上传一堆工资单,这些条目将保存到数据库中。然后,工资单查看器会提取当前登录用户的emp_id,并显示其所有earnings, deductions, info及其总earnings(all earnings are added), total deductions(all deductions are added) and netpay(total earning-total deduction)

我的问题是,我的教授说我需要“规范化”表格,但我想知道我怎么可能将其正常化,因为我认为这是“正常化”的。但是,我确实试图创建两个erds,但我有几个问题:

  1. 为什么在系统只是阅读上传者提供的内容时,我会分配收入和扣除额?
  2. 我的教授建议我得到所有员工相同的扣除额,但没有这样的事情,我能想到的最接近的是保险,这也取决于依赖关系和影响它的其他因素。
  3. 如果我确实试图创建第3号,那么如果费率发生变化就会出现问题(即2月份的保险1 = 3月份100美元变成200美元)。由于payslip查看器依赖于该表,这意味着如果用户查看他2月份的工资单,他的保险也将是200美元。
  4. 我正在创建这个数据库以符合系统的要求,上传者可以上传薪资单的电子表格,这不足以证明我的错误吗?也许如果这是一个工资单系统,我可以设置其他表,而不是影响基于系统的工资单BUT的输出,输出已经完成,hr只需要将它们上传到数据库。
  5. 我的第一个ERD:enter image description here

    我的第二个ERD:enter image description here

    (我这样做是为了尝试并将其标准化,但是对于系统的要求,我认为这不合适)

3 个答案:

答案 0 :(得分:1)

据我所知,你看起来很接近,你只需要将扣除和收入表中的关系改为一对多,并删除所有多余的“收入”和“扣除”列,留下你以下内容:

enter image description here

通过这种方式,您可以根据需要获得与薪资单相关的收入记录和扣减记录。

答案 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`);

视觉呈现 enter image description here