如何在单个表中处理多行修订?

时间:2009-09-24 02:33:46

标签: c# sql database sql-server-2005 database-design

我正在开发一个用户输入定价报价的应用。他们希望能够对引号进行多次修改,并且可以访问所有引号以进行修改和查看。

目前,数据存储在如下所示的报价表中:

QuoteID(PK,autonumber) data1,data2,data3等。

QuoteID对其他表的外键,用于一对多关系,以获取有关报价的详细信息。

有没有办法在报价表中保留所有修订并处理修订?这样,与其他表的FK关系就不会被破坏。

4 个答案:

答案 0 :(得分:1)

基于你所说的和一些猜测你还需要什么,我想出了下面的表结构大纲(ALLCAPS中的表,CamelCase中的列;以Id结尾的列是身份或合适的自然键; ColumnId名称与该表名匹配的位置,它是主键,否则它是引用表中的外键):

--  CUSTOMER  ----
CustomerId

--  QUOTE  ----
QuoteId
CustomerId
Data1Id

--  QUOTEREVISION  ----
QuoteRevisionid
QuoteId
CreatedAt
Data2Id
Data3Id

--  DATA1  ----
Data1Id

--  DATA2  ----
Data2Id

--  DATA3  ----
Data3Id

CUSTOMER记录谁可以报价。

QUOTE跟踪客户的报价。每个给定的[无论]是否为他们输入引号的一行。

QUOTEREVISION记录他们输入的每个报价修订版。首次创建Quote时,也会创建第一个QuoteRevision。 CreatedAt将是一个日期,以跟踪它们发生的时间。 QuoteId + CreatedAt是表的自然键,因此您可能不需要QuoteRevisionsId。

DATA1,DATA2,DATA3和其他根据需要包含额外信息。我将Data1配置为保存与报价级别相关的信息 - 也就是说,同样的事实将适用于每个报价版本。 Data2和Data3将包含可能因修订版本而异的数据。

我毫不怀疑这里的内容并不适用于您的问题,但希望这能为您提供一些可能的解决方案。

答案 1 :(得分:0)

您可以在Quotes表和其他制作复合键的表中添加Revision列,但保持同步可能有点尴尬。我认为最好的办法是让QuoteID列不是主键,并添加一个新的主键,用于将Quotes表链接到其他表。 QuoteID然后变成一个你可以搜索的字段(你可能想要在它上面创建一个索引)。

答案 2 :(得分:0)

我同意Philip Kelley的设计,我可能只注意到您可以使用ROW_NUMBER()在输出中计算的报价修订版或根据您的DBMS进行仿真。

还有一本关于存储历史数据的好书:http://www.cs.arizona.edu/people/rts/tdbbook.pdf

答案 3 :(得分:0)

我认为数据元素的单独数据库表(如下所示)可能会使数据库结构更加复杂。

-- DATA1 ---- Data1Id

-- DATA2 ---- Data2Id

-- DATA3 ---- Data3Id

您将这些数据元素创建为修订表中的列是什么?