首页 > 解决方案 > 我应该序列化一个 assoc 数组还是动态生成表格来记录这些数据?

问题描述

我创建了一个 php 脚本来自动解析我的工资单 PDF,并希望将它们存储在数据库中以便于参考(为了熟悉,最好使用 MySQL)。

我最终得到的数据(每个工资单)是(例如):(加上大约 40 个其他列,其中大多数不会定期更改)。

Array
(
    [assignment] => 123456
    [name] => JOE BLOGS
    [location] => 42 WEST STREET
    [department] => Lancashire
    [job_title] => Imaginary
    [payscale_description] => Generic desciprtion
    [salary] => 12345.00
    [hours] => 40
    [pt_salary] => 12345.00
    [pay] => Array
        (
            [Basic Pay] => 1234.00
            [Additional Hours (OOH)] => 567.00
            [Night Allowance] => 891.10
            [Weekend Allowance] => 112.13
        )

    [deductions] => Array
        (
            [PAYE] => 123.00
            [National Insurance] => 456.00
            [Pension] => 789.00
            [Student Loan] => 101.12
        )

)

现在 [工资] 和 [扣除] 可能会每月更改(例如,有时可能会有费用/生活费/停车费等)。该脚本只创建了 assoc 数组,但在这些常见的数组之上还有大约 20 个变量加法/减法。没有在 MySQL 表中创建另外 20 个列,到目前为止,我已经使用 JSON 序列化这两个字段并像这样存储它们,但是很难搜索它们/动态修改等。

我只是想知道是否有我错过的动态列的明显解决方案(其中一些我可能还没有预测到)。我进一步想知道为每个月的每个支付/扣除动态创建一个表,然后在搜索时进行 JOIN,但这似乎过分了。

任何帮助感激不尽!

标签: phpmysqlserialization

解决方案


您可以在payslip数据库表旁边创建第二个名为 的表specification,或类似的东西。该表中的列将是idpayslipIdtitleamount。您的 [pay] 和 [deductions] 将适合这样:

id  payslipId  title                     amount
1      1     Basic Pay                   1234.00
2      1     Additional Hours (OOH)       567.00
3      1     Night Allowance              891.10
4      1     Weekend Allowance            112.13
5      1     PAYE                        -123.00
6      1     National Insurance          -456.00
7      1     Pension                     -789.00
8      1     Student Loan                -101.12

您可以根据需要添加任意数量的 [pay] 和 [deductions] 行。

请注意,该payslipId列将每个规范链接到正确的工资单。

正如 Magnus Eriksson 在他的评论中提到的,这是“数据库规范化”的一部分。


推荐阅读