Python Django数据库设计

Python Django数据库设计,python,django,database,Python,Django,Database,我正在写一个在线工资系统,我在设计数据库时遇到了问题。 客户可以签约我们的项目。他的信息存储在模型客户机中。客户可以有一个或多个公司模型公司。每个公司都有员工模型员工,一名员工有一套其他的地址、税务、社会保障等模型。 如果员工的数据发生变化,例如婚礼后的新姓名,或税务数据发生变化,则带有变化日期的新记录将在xxx_字段中注册,并在模型中有效。由于历史原因,旧记录必须保存在数据库中 以下是我的模型: class Client (models.Model): client_name = mo

我正在写一个在线工资系统,我在设计数据库时遇到了问题。 客户可以签约我们的项目。他的信息存储在模型客户机中。客户可以有一个或多个公司模型公司。每个公司都有员工模型员工,一名员工有一套其他的地址、税务、社会保障等模型。 如果员工的数据发生变化,例如婚礼后的新姓名,或税务数据发生变化,则带有变化日期的新记录将在xxx_字段中注册,并在模型中有效。由于历史原因,旧记录必须保存在数据库中

以下是我的模型:

class Client (models.Model):
    client_name = models.CharField (...)
    ....

class Company (models.Model):
    clientID = models.ForeignKey(Client)
    company_name = models.CharField (...)
    ....

class Staff (models.Model):
    clientID = models.ForeignKey(Client)
    companyID = models.ForeignKey(Company)
    staff_nr = models.IntegerField (....)
    staff_valid = models.DateField (....)
    staff_name = models.CharField (...)
    ....

class StaffTax (model.Model):
    clientID = models.ForeignKey(Client)
    companyID = models.ForeignKey(Company)
    staffID = models.ForeignKey(Staff)
    tax_valid = models.DateField (....)
    tax_nr = models.CharField (...)
    ....

class StaffSocSec (model.Model):
    clientID = models.ForeignKey(Client)
    companyID = models.ForeignKey(Company)
    staffID = models.ForeignKey(Staff)
    sosec_valid = models.DateField (....)
    sosec_nr = models.CharField (....)
    ....
如果员工没有任何历史记录,那么一切都正常。 现在让我们假设,一名员工在ModelStaff field staff_valie中获得了一个新的句号,因为他的地址已更改。此新记录将获得一个新的id pk 如果开始工资计算,将使用员工的最新记录。 对StaffTayx等的查询设置使用StaffID进行。 但是税务信息与model Staff中的第一个旧记录相关,查询集找不到任何记录

当然,我可以忽略ID,将StaffTax和其他模型中的staffID定义为普通Charfield,并使用这个普通Charfield而不是primery key ID创建查询集。 但我会失去很多功能性,比如在modelformset中自动创建的选项

我也不能将staffID设置为primery key,因为其他客户机可能具有相同的staffID,而我会得到一个唯一的错误

有人知道如何解决这个问题吗


谢谢大家

听起来您只是希望能够保存模型数据更改的历史记录。有几种选择,请参阅

在编辑历史和查看报告方面,可能是一个很好的匹配。这有助于提高效率,并有能力轻松实现


或者

谢谢seddonym,但我不确定django修订版是否适合我。用户经常希望访问旧记录,可以使用旧数据打印报告,用户可以编辑旧数据以更正错误并重新计算旧记录的工资单。我阅读了文档,在使用它们之前,我总是要还原旧数据,这使得事情变得非常复杂。这里有一些其他的软件包可能会有帮助,我已经相应地更新了我的答案。