2014-11-21 65 views
0

我正在写一个在线工资系统,我有问题来设计我的数据库。 客户可以订购我们的程序。他的信息存储在模型“客户端”中。客户可以拥有一个或多个公司(模型“公司”)。每个公司都有工作人员(模型“工作人员”),工作人员还有一系列用于地址,税务,社会保障等的其他模型。 如果工作人员的数据发生变化(例如婚礼后的新名称或税务数据)一个新的记录与更改的日期将被注册(模型中的字段“xxx_valid”)。由于历史原因,旧的记录必须保存在数据库中。Django数据库设计

这里是我的模型:

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 (....) 
    .... 

一切工作正常,如果工作人员没有历史。 现在让我们说,一名员工在模特Staff(field staff_valie)中获得一个新的时期,因为他的地址已经改变。这个新记录将得到一个新的ID(pk) 如果工资计算开始,将使用最新的工作人员记录。 对StaffTayx等的查询集使用StaffID制作。 但税务信息与模型Staff中的第一条(旧)记录相关,并且查询集没有找到任何记录。

当然,我可以忽略ID,在模型StaffTax(和其他人)中将staffID定义为正常的Charfield,并使用此正常Charfield而不是使用主键ID来创建我的查询集。 但是我会失去很多fun​​cionality,比如在modelformset中为自动创建的选项。

我也不能设置staffID有主键,因为其他客户端可能有相同的StaffID,并且我得到一个唯一的错误。

有人有一个想法如何解决这个问题?

非常感谢你们!

回答

0

这听起来像你只是想保持模型数据变化的历史。有几个选项,请参阅this list on Django packages

在编辑历史和查看报告方面,django-simple-history可能是一个很好的匹配。那很容易admin integrationquery the history的能力。

或者

+0

感谢seddonym,但我不确定django-revions是否适合我。用户通常希望访问旧记录,可以使用旧数据打印报告,并且用户可以编辑旧数据以纠正错误并重新计算旧记录的工资单。 我读了文档,它接缝我总是必须恢复使用它们之前的旧数据,这使得事情变得非常复杂 – sascha2014 2014-11-21 09:59:30

+0

还有其他一些软件包可能会有所帮助,因此我已经更新了我的答案。 – seddonym 2014-11-21 11:14:38

+0

django-simple-history看起来不错。非常感谢你的帮助 – sascha2014 2014-11-21 13:07:54