为估计和工作构建表

时间:2015-09-29 18:02:33

标签: postgresql database-design database-schema

我正在为我们的办公室开发应用程序,在开始编写应用程序的这一部分之前,我需要了解构建数据的最佳方法。该应用程序将允许销售团队输入估算并将其提供给客户。如果客户接受了估算,那么它将成为一项工作,并安排在适当的一天。我需要一种结构,允许我在历史上看到估计处于其原始状态,但一旦估计成为工作就允许变更单。完成工作后,我需要查看整个工作,包括所有变更单。

我考虑过有一个估算表,一个估算详细信息表,然后,一旦将估算变成一个作业,记录就会被复制到作业表,作业详细信息表,然后是变更单表?这对我来说似乎并不高效。

有人会为我提供一些设计指示吗?

样本结构:

enter image description here

1 个答案:

答案 0 :(得分:0)

您想要的是能够跟踪您的实体从初始创建到最终状态的变化。您还需要“回顾”以查看过去任何特定时间存在的实体。

易。虽然不是很简单。您需要的是对数据进行版本控制。我已经在几个答案中提到了版本控制,所以不要在这里重复一些相当冗长的答案,让我把你推荐给一对。

https://dba.stackexchange.com/questions/114580/best-way-to-design-a-database-and-table-to-keep-records-of-changes/114738#114738

Which option would be better for historical information of a table?

很抱歉这里缺少详细信息,但您的问题非常笼统。

更新 估算中没有任何内容会随着时间的推移而改变(虽然我不明白它为什么需要地址信息),所以它必须是您希望随时间保留的estimate_details 。但我不知道估计是否有多个细节。该图显示了1:n关系,所以我将继续使用它。

最好的办法是在估算值 estimate_details 之间放置另一个实体,例如出价

create table bids(
    estimate_id   int not null,
    eff_date      date not null default current_date(),
    ...,
    constraint PK_Bids primary key( estimate_id, eff_date ),
    constraint FK_Bids_Estimate foreign key( estimate_id )
        references estimates( ID )
);
create table estimate_details(
    bid_id         int not null,
    eff_date       date not null,
    product_id     int not null,
    quantity       float,
    constraint PK_Estimate_Details primary key( bid_id, eff_date, product_id),
    constraint FK_EstimateDetail_Bid foreign key( bid_id, eff_date )
        references bids( estimate_id, eff_date )
);

我在这里假设没有两个细节会涉及同一产品。其他出价数据可能包括提交给客户的日期,总价,客户回复的日期以及出价是否被接受。

创建估算值时,还会创建第一个出价,其ID与估算值和生效日期相同,可以是估算值或其他有意义日期开始的日期工作。详细信息使用估算ID和出价日期链接到出价。然后,出价结束并提交给客户。客户拒绝,因此创建了新的出价 - 相同的ID,不同的日期。新细节链接到此出价。

可以有任意数量的出价,每个出价都包含任意数量的细节。您可以随时查询任何估算值,只需检索您想要查看的日期的出价并获取与该出价相关联的详细信息。

我还假设每个新的出价都以清白的方式开始 - 没有任何细节继续适用于新的出价。如果这是错误的,如果您想重新使用出价中的某些详细信息,那么稍微更改就可以消除在出价中复制这些详细信息的需要。