Database 如何保持现有记录的数据不变

Database 如何保持现有记录的数据不变,database,database-design,relational-database,Database,Database Design,Relational Database,考虑为交通部门设计一个数据库。有一个表格用于:违规、违法和司机 在法律表格中,我们有罚款成本、条款编号、解释、原因等属性 现在,如果我们将来更改成本和条款编号,我不希望这会影响已经存在的记录。但是表违例性和合法性已经处于一种关系中,因此如果查询它们,这将更改旧记录 我举了一个简单的例子来说明我的担忧,但我想知道解决这种情况的概念 如何做到这一点 更新1) 我觉得也许我没有解释清楚我想要什么,因为有些答案并没有朝着正确的方向发展。因此,我会解释: 我拥有以下实体: violation, commi

考虑为交通部门设计一个数据库。有一个表格用于:违规、违法和司机

在法律表格中,我们有罚款成本、条款编号、解释、原因等属性

现在,如果我们将来更改成本和条款编号,我不希望这会影响已经存在的记录。但是表违例性和合法性已经处于一种关系中,因此如果查询它们,这将更改旧记录

我举了一个简单的例子来说明我的担忧,但我想知道解决这种情况的概念

如何做到这一点

更新1)

我觉得也许我没有解释清楚我想要什么,因为有些答案并没有朝着正确的方向发展。因此,我会解释: 我拥有以下实体:

violation, committee, decision, meeting, and legal terms
关系1表示:
委员会召开
会议
并就
违规
x作出
决定。
另一种关系是:
决定
是根据
法律条款
做出的


现在,不必详细讨论“法律条款”表,假设它具有罚款、法律条款和参考等属性。。。如果有一天我们将条款“abc”的罚款改为100美元而不是50美元,那么我们检索到一份旧违规记录,其罚款基于条款“abc”,成本将显示为100美元,尽管它应该显示为50美元。

我将如何处理这种情况:

  • 首先,我假设您的
    违规
    表有违规发生的日期。如果不是的话,它应该有
  • 子句
    成本
    实体是分开的,因此需要放在单独的表中
  • 违规
    表应该有一个外键引用,指向标识单个子句的
    子句
    主键。这样可以确保,如果子句编号发生更改,您仍将在冲突表中引用正确的子句
  • 成本
    表应具有对条款表的外键引用,即每个成本记录都与一个条款相关联
  • 成本
    表应该有一个日期列,用于标识价格从何时起生效。这样,一个条款可以有多个价格记录(但只有一个被视为“有效”,即具有最新生效日期的价格记录)
  • 这意味着条款编号和价格可以相互独立地更改,而不会影响
    违规
    表中数据的有效性
  • 架构可能如下所示:

    然后,当查询您的违规行为时,您只需拉出违规行为发生日期之前的最新条款价格

    例如,假设我有一个包含以下数据的子句:

    Id        Code        Description
    ---------------------------------
    1          101         Speeding
    
    该条款可能有以下与之相关的成本记录:

    Id        Cost        Valid From        ClauseId
    ------------------------------------------------
    1          $60         01/01/2013          1
    2          $70         01/02/2013          1
    3          $80         01/03/2013          1
    
    因此,上述所有费用都与“超速”条款有关。如果您想知道当前成本是多少,您可以从与该子句关联的成本表中选择记录,该记录具有最新的有效起始日期,这将为您提供80美元

    现在,假设您有以下违规行为:

    Id        Name        ClauseId        Date Occurred
    ---------------------------------------------------
    1         Benjamin        1            16/02/2013
    
    在这起违规事件发生时,成本为70美元。因此,为了选择具有正确价格的违规记录,您需要构造一个连接违规、子句和成本表的查询。您将仅选择成本有效起始日期小于违规发生日期的记录

    这将为您提供以下结果:

    Name        Date Occurred        Description        cost        Valid From
    --------------------------------------------------------------------------
    Benjamin      16/02/2013           Speeding          $60        01/01/2013
    Benjamin      16/02/2013           Speeding          $70        01/02/2013
    

    然后,您只需选择具有最大有效起始日期的记录,只留下一行,在发生此冲突时为您提供70美元的正确价格。

    解决方案是规范化表。下面是对这个概念的一个很好的解释:

    这是一种非常标准的方法,当您希望以这种方式保留行的数据时,例如,当您希望保留订单或发票上产品的价格时,您只需将值存储在行中。对于打算保持不变且对保留价值非常重要的数据,我建议采用这种方法。

    以您为例

    在法律表格中,我们有罚款成本、条款编号、解释、原因等属性

    现在,如果我们将来更改成本和条款编号,我不希望这会影响已经存在的记录

    那么,让我们定义一下合法性表

    Legalities
    ----------
    Legalities ID
    Explantion
    Reason
    etc
    
    合法性ID是主(群集)密钥。它是一个升序整数或long,或其他UID

    我们定义一个子句表。我假设你们一起改变成本和条款

    Clause
    ------
    Clause ID
    Legalities ID
    Date written
    Clause
    Cost
    
    子句ID是主(集群)键。它是一个升序整数或long,或其他UID

    您将在上定义一个唯一索引(合法ID、写入日期)。这样,检索到的第一行将是最新的子句和成本


    您可以为要保留更改历史记录的任何列定义一个类似于表的子句。

    我很确定我的答案符合您的要求,即您可以选择一个违规以及违规发生时适用的价格。如果您需要我进一步解释细节,请告诉我。如果其他属性也可能发生变化,例如条款文本中的几个单词,该怎么办?这取决于具体情况。如果文本发生更改,违规行为是否仍然有效?只是需要跟踪的文本和成本还是每个领域?如果不是每个字段,您是否设想将来会被要求扩展功能以包括其他字段?主要是,我想永远保存详细信息,以供:违规决策期间的委员会成员、条款文本和罚款成本。如果您以同样的方式将其扩展到clau,我的解决方案会起作用吗