【问题标题】:How to keep data for existing records unchanged如何保持现有记录的数据不变
【发布时间】:2013-03-20 03:15:52
【问题描述】:

考虑为交通部门设计一个数据库。有一个表格:违规、合法性和驱动程序。

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

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

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

如何做到这一点?

更新 1)

我觉得我可能没有准确地解释我想要什么,因为有些答案没有朝着正确的方向发展。因此,我将解释: 我有以下实体:

violation, committee, decision, meeting, and legal terms

关系 1 说:committee 持有一个 meeting 并接受一个关于 violation x 的 decision。 另一个关系说:decision 是基于legal terms 拍摄的。

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

【问题讨论】:

  • 我很确定我的答案符合您的要求您可以挑选出违规以及违规发生时适用的价格。如果您需要我进一步解释详细信息,请告诉我。
  • 如果其他属性也可能发生变化,例如从句文本中的几个单词怎么办?
  • 视情况而定。如果文本更改,违规仍然有效吗?只是需要跟踪的文本和成本还是每个字段?如果不是每个字段,您是否设想将来被要求扩展功能以包含其他字段?
  • 主要是我想永久保存以下信息:违规决策期间的委员会成员、条款文本和罚款费用。
  • 如果您将我的解决方案扩展为以与子句文本相同的方式工作,那么我的解决方案是否有效? IE。将子句文本保留在一个单独的表格中,这将为您提供完整的历史记录(有点像本网站上的编辑历史记录)?

标签: database database-design relational-database


【解决方案1】:

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

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

架构可能如下所示:

然后在查询您的违规行为时,您只需提取在违规发生之日之前最新条款价格。

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      以你为例,

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

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

      所以,让我们定义 Legalities 表。

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

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

      我们定义了一个子句表。我假设您同时更改成本和条款。

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

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

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

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 2018-11-21
          • 2011-05-06
          • 1970-01-01
          • 1970-01-01
          • 2021-08-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多