0

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

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

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

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

这个怎么做?

更新 1)

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

violation, committee, decision, meeting, and legal terms

关系 1 说:committee持有 ameeting并接受decision关于violationx 的 a。另一个关系说:decision是基于legal terms.

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

4

4 回答 4

1

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

  1. 首先,我假设您的Violations表有违规发生的日期。如果没有,它应该有。
  2. Clause和实体是分开的Cost,因此需要在单独的表中。
  3. Violations表应具有对Clauses标识单个子句的主键的外键引用。这可确保如果条款编号发生更改,您仍将引用违规表中的正确条款。
  4. Costs表应该有一个对子句表 IE 的外键引用,每个成本记录都与一个子句相关联。
  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 美元的正确价格。

于 2013-03-19T17:46:22.143 回答
1

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

于 2013-03-19T17:53:14.743 回答
0

以你为例,

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

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

因此,让我们定义 Legalities 表。

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

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

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

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

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

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

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

于 2013-03-19T17:54:16.437 回答
-1

The solution is to normalize the tables. Here is a good explanation of the concept:Explain_normalization_with_examples

于 2013-03-19T17:51:44.207 回答