我正在开发一个用户输入定价报价的应用。他们希望能够对引号进行多次修改,并且可以访问所有引号以进行修改和查看。
目前,数据存储在如下所示的报价表中:
QuoteID(PK,autonumber) data1,data2,data3等。
QuoteID对其他表的外键,用于一对多关系,以获取有关报价的详细信息。
有没有办法在报价表中保留所有修订并处理修订?这样,与其他表的FK关系就不会被破坏。
答案 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
您将这些数据元素创建为修订表中的列是什么?