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

时间:2013-03-19 17:34:26

标签: database database-design relational-database

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

在合法性表中,我们有精细成本,条款编号,解释,原因等属性....

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

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

怎么做?

更新1)

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

violation, committee, decision, meeting, and legal terms

关系1表示:committee拥有meeting并且decision代表violation x。 另一种关系说:decision是根据legal terms拍摄的。

现在,在不进入“法律条款”表的细节的情况下,假设它具有罚款,法律条款和属性的属性。引用等...如果有一天我们将条款“abc”的罚款更改为100美元而不是50美元,那么我们会检索旧违规的记录,其罚款基于“abc”条款,费用将显示为100美元虽然它应该显示50美元。

4 个答案:

答案 0 :(得分:1)

以下是我将如何处理这种情况:

  1. 首先,我假设您的Violations表格中存在违规发生的日期。如果没有它应该有。
  2. ClauseCost个实体是分开的,因此需要位于不同的表格中。
  3. Violations表应该有Clauses主键的外键引用,用于标识单个子句。这可确保如果子句号发生更改,您仍将在违规表中引用正确的子句。
  4. Costs表应该具有对子句表I.E的外键引用。每个成本记录都与一个条款相关联。
  5. Costs表应该有一个日期列,用于标识价格何时有效。这样一个条款可以有多个价格记录(但只有一个会被认为是“有效的”I.E.具有最新有效日期的那个)。
  6. 这意味着条款编号和价格可以相互独立地更改,而不会影响Violations表中数据的有效性。
  7. 架构可能如下所示:

    enter image description here

    然后,在查询违规行为时,您只需将之前最新条款价格撤销到违规发生之日。

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

    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美元的正确价格。

答案 1 :(得分:1)

这是一种非常标准的方法,当您希望以这种方式保留行的数据时,例如,当您想要保留订单或发票上的产品价格时,您只需将值存储在行中。对于意图不变的数据以及保留价值的重要性,这是我推荐的方法。

答案 2 :(得分:0)

举个例子,

  

在合法性表中,我们有精细成本,条款编号,解释,原因等属性....

     

现在,如果我们改变成本&将来的条款编号,我不希望这会影响已有的记录。

所以,让我们定义合法性表格。

Legalities
----------
Legalities ID
Explantion
Reason
etc

合法性ID是主要(群集)密钥。它是一个升序整数或长整数,或其他一些UID。

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

Clause
------
Clause ID
Legalities ID
Date written
Clause
Cost

子句ID是主要(群集)密钥。它是一个升序整数或长整数,或其他一些UID。

您可以在(法律ID,日期写下降)上定义唯一索引。这样,检索到的第一行将是最新的子句和成本。

您可以为要保留更改历史记录的任何列定义类似Clause的表。

答案 3 :(得分:-1)

解决方案是规范化表格。以下是对该概念的一个很好的解释:Explain_normalization_with_examples