为估计和工作构建表

Structuring Tables for Estimates and Jobs

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

我考虑过进行估算 table、估算详细信息 table 然后,一旦将估算转化为工作,记录就会复制到工作中 table 、工作详情 table 然后是变更单 table?这对我来说似乎不是很有效。

有人可以帮我解释一下这个设计吗?

示例结构:

您想要的是能够跟踪您的实体从初始创建到最终状态的变化。您还需要 "look back" 查看该实体在过去任何特定时间的存在情况。

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

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?

很抱歉这里没有详细信息,但您的问题本质上很笼统。

更新: estimates 中没有任何内容会随时间变化(虽然我不明白为什么它需要地址信息) , 所以它必须是 estimate_details 你想随着时间的推移保留下来。但我无法判断是否有多个细节需要估算。该图显示了一个 1:n 关系,所以我将使用它。

最好的办法是在 estimatesestimate_details 之间放置另一个实体,比如 bids :

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 和出价日期详细了解出价 link。然后投标完成并提交给客户。客户拒绝,因此创建了一个新的出价——相同的 ID,不同的日期。此出价的新详细信息 link。

可以有任意数量的出价,每个出价具有任意数量的详细信息。您可以随时查询任何估算值,只需检索您想要查看的日期的出价并获取 linked 到该出价的详细信息。

我还假设每个新出价都以全新的方式开始——没有任何细节可以原封不动地应用于新出价。如果那是错误的,如果您想在不同的出价中重复使用某些详细信息,那么稍作更改就可以消除在不同出价中重复这些详细信息的需要。