代码之家  ›  专栏  ›  技术社区  ›  Jeach

数据库-数据版本控制(后续)

  •  5
  • Jeach  · 技术社区  · 17 年前

    我最初的问题可以找到 here

    现在,我的数据变成了:

    Person
    ------------------------------------------------
    ID                UINT NOT NULL,
    NameID            UINT NOT NULL,
    DOB               DATE NOT NULL,
    Email             VARCHAR(100) NOT NULL
    
    PersonAudit
    ------------------------------------------------
    ID                UINT NOT NULL,
    NameID            UINT NOT NULL,
    DOB               DATE NOT NULL,
    Email             VARCHAR(100) NOT NULL,
    UserID            UINT NOT NULL,         -- Who
    PersonID          UINT NOT NULL,         -- What
    AffectedOn        DATE NOT NULL,         -- When
    Comment           VARCHAR(500) NOT NULL  -- Why
    
    Name
    ------------------------------------------------
    ID                UINT NOT NULL,
    FirstName         VARCHAR(200) NOT NULL,
    LastName          VARCHAR(200) NOT NULL,
    NickName          VARCHAR(200) NOT NULL
    
    NameAudit
    ------------------------------------------------
    ID                UINT NOT NULL,
    FirstName         VARCHAR(200) NOT NULL,
    LastName          VARCHAR(200) NOT NULL,
    NickName          VARCHAR(200) NOT NULL,
    UserID            UINT NOT NULL,         -- Who
    NameID            UINT NOT NULL,         -- What
    AffectedOn        DATE NOT NULL,         -- When
    Comment           VARCHAR(500) NOT NULL  -- Why
    

    在GUI中,我们可以看到以下形式:

    ID            :  89213483
    First Name    :  Firsty
    Last Name     :  Lasty
    Nick Name     :  Nicky
    Date of Birth :  January 20th, 2005
    Email Address :  my.email@host.com
    

    2 回复  |  直到 9 年前
        1
  •  6
  •   Community Mohan Dere    9 年前

    您可能应该尝试阅读有关“时态数据库”处理的信息。你可以看看的两本书是Darwen,Date和Lorentzos Temporal Data and the Relational Model “而且(在一个完全不同的极端)” Developing Time-Oriented Database Applications in SQL ”,Richard T.Snodgrass,Morgan Kaufmann出版社,股份有限公司,旧金山,1999年7月,504+xxiii页,ISBN 1-55860-436-7。这本书已经绝版,但可以在他的网站上以PDF格式获得,网址为 cs.arizona.edu 。您还可以查找“ Allen's Relations


    Start time        -- When this set of values became valid
    End time          -- When this set of values became invalid
    PersonID          -- Person.ID (or PersonAudit.ID) for Person data
    NameID            -- Name.ID (or NameAudit.ID) for Name data
    DOB               -- Date of Birth recorded while data was valid
    Email             -- Email address recorded while data was valid
    FirstName         -- FirstName recorded while data was valid
    LastName          -- LastName recorded while data was valid
    NickName          -- NickName recorded while data was valid
    

    我假设曾经是一个人。ID已建立,不会更改;名字也是如此。ID。这意味着在记录有效期间,它们仍然有效。

    其中一个难点是建立正确的“开始时间”和“结束时间”值集,因为转换可能发生在任一表中(或两者都发生)。目前,我甚至不确定你是否拥有所需的所有数据。插入新记录时,您不会记录其生效的时间(


    还有很多可以说的。不过,在进一步讨论之前,我宁愿对迄今为止提出的一些问题有一些反馈。


    其他一些SO问题可能会有所帮助:


    自从这个答案第一次被写出来以来,又出版了另一本书,介绍另一组名为“断言版本控制”的方法来处理时态数据。这本书是“ Managing Time in Relational Databases: How to Design, Update and Query Temporal Data 汤姆·约翰斯顿和兰德尔·韦斯。您可以在以下网址找到他们的公司 AssertedVersioning.com

    此外,SQL 2011标准(ISO/IEC 9075:2011,分为多个部分)已经发布。它包括一些时间数据支持。您可以在以下网址了解更多关于时态数据的信息以及其他相关问题 TemporalData.com

        2
  •  0
  •   Quassnoi    17 年前

    保持一个具有自动递增功能的单一更改表 ID 并进行所有更改以引用该表。

    始终将原始记录放在审核表中。

    这样地:

    `Change`
    
    1
    2
    3
    4
    5
    6
    
    `NameAudit`
    
    1 - created as John Smith
    5 - changed to James Smith
    
    `PersonAudit`
    
    1 - created as born on `01.01.1980` in `Seattle, WA`
    2 - changed DOB to '01.01.1980`
    3 - changed DOB to '02.01.1980`
    4 - changed DOB to '02.01.1980`
    6 - changes POB to `Washington, DC`
    
    

    SELECT  c.id,
            (
            SELECT   MAX(id)
            FROM     NameAudit na
            WHER     na.id <= c.id
            ) as nameVersion,
            (
            SELECT   MAX(id)
            FROM     PersonAudit pa
            WHER     pa.id <= c.id
            ) as personVersion,
            na.*,
            pa.*
    FROM    change c
    JOIN    NameAudit na
    ON      na.id = nameVersion
    JOIN    PersonAudit pa
    ON      pa.id = nameVersion
    WHERE   change_id BETWEEN 1 AND 6