SQL Server参考/查找表和更新

时间:2015-10-23 14:28:01

标签: sql sql-server-2008 database-design relational-database

我有两个SQL表:TableA和LookupTable。 TableA将LookupTableID(PK)存储为外键和其他一些字段。 LookupTable存储LookupTableID,PharmacyName,PharmacyAddress,PostCode,PharmacyTelephone,PharmacyFax,PharmacyEmail等。

TableA中的数据以Asp.net形式显示。表单的每一行都有两个按钮:“打印”按钮和“预览”按钮。当用户单击“打印”按钮时,文档中将生成包含来自LookupTable的药房信息(表A中的LookupTableID)以及TableA中的一些其他信息的pdf文档。此外,TableA中的Printed字段设置为true,并创建TableA中的新记录,打印和新创建的记录之间的唯一区别在于以下字段:StartDate,EndDate和Printed。在新创建的记录中,StartDate变为“打印记录的EndDate + 1天”,EndDate变为“打印记录的EndDate + 7天”,新创建的记录的Printed为false。

当用户单击“预览”按钮时,将在文档中生成包含来自LookupTable的药房信息(TableA中的LookupTableID)以及TableA中的一些其他信息的pdf文档。请注意,在这种情况下,系统不会创建新记录或打印为true。

我在上面的数据库设计中遇到的问题是:如果其中一列允许修改查找表中的PostCode并且用户点击预览按钮获取历史/打印记录,那么预览pdf文档将显示最新信息即新邮政编码而不是印刷时的邮政编码。我知道,这是一种预期的行为。但是,我希望在打印时显示历史记录的信息,以及仅显示尚未打印的记录的最新信息。

我的一个解决方法是将LookupTable视为库表,供用户选择药房,然后将所有内容(查找表中的所有字段)复制到所选药房的TableA。这将在数​​据库中创建大量重复数据。有没有更好的方法来实现我的目标?任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

对于历史数据,(至少)有两种方法:

  1. 您使用ValidUntil日期存储信息。带有NULL的那个是当前的。
  2. 可以找到类似于以下内容的旧数据:

    DECLARE @test TABLE(id INT,ValidUntil DATETIME);
    INSERT INTO @test VALUES(1,{d'2015-01-01'})
                           ,(2,{d'2015-02-01'})
                           ,(3,{d'2015-03-01'})
                           ,(4,NULL);
    
    DECLARE @ValidOn DATETIME={d'2015-01-02'}; --set any value you like, even NULL
    
    WITH HelperDates AS
    (
        SELECT ISNULL(@ValidOn,GETDATE()) AS ValidOn
              ,(SELECT MAX(ValidUntil) FROM @test) AS MaxDate
    )
    SELECT TOP 1 tbl.* 
    FROM @test AS tbl
    CROSS JOIN HelperDates AS hd 
    WHERE hd.MaxDate IS NULL OR hd.ValidOn > hd.MaxDate OR  hd.ValidOn <= tbl.ValidUntil
    ORDER BY tbl.ValidUntil ASC
    

    特别是对于印刷品,我更喜欢这种方式

    1. 在创建文档时存储必要的数据。在我看来,最好的是XML列和创建的文档。
    2. 祝你找到最好的方法!

答案 1 :(得分:1)

这似乎是一种不必要的复杂且不灵活的方式,可以在每次打印时拍摄数据快照。看起来更好的选择是对两个表进行版本化并创建第三个表,该表只包含TableA ID和打印日期。无需复制数据。要在任何特定打印日期重现数据,只需使用打印日期查询截至该日期的版本化数据。无论从那时起它发生了多大的变化,你都会收到该日期出现的数据。

我在这里给出了类似情况的一个答案:

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

希望它有所帮助。