考虑为交通部门设计数据库。有一个表格:违规,合法性和司机。
在合法性表中,我们有精细成本,条款编号,解释,原因等属性....
现在,如果我们改变成本&将来的条款编号,我不希望这会影响已有的记录。但是表违规和合法性已经存在关系,因此如果查询它们,这将改变旧记录。
我举了一个简单的例子来说明我的担忧,但我想知道解决这种情况的概念。
怎么做?
更新1)
我觉得也许我没有准确解释我想要什么,因为有些答案没有朝着正确的方向发展。因此,我会解释: 我有实体:
violation, committee, decision, meeting, and legal terms
关系1表示:committee
拥有meeting
并且decision
代表violation
x。
另一种关系说:decision
是根据legal terms
拍摄的。
现在,在不进入“法律条款”表的细节的情况下,假设它具有罚款,法律条款和属性的属性。引用等...如果有一天我们将条款“abc”的罚款更改为100美元而不是50美元,那么我们会检索旧违规的记录,其罚款基于“abc”条款,费用将显示为100美元虽然它应该显示50美元。
答案 0 :(得分:1)
以下是我将如何处理这种情况:
Violations
表格中存在违规发生的日期。如果没有它应该有。Clause
和Cost
个实体是分开的,因此需要位于不同的表格中。Violations
表应该有Clauses
主键的外键引用,用于标识单个子句。这可确保如果子句号发生更改,您仍将在违规表中引用正确的子句。Costs
表应该具有对子句表I.E的外键引用。每个成本记录都与一个条款相关联。Costs
表应该有一个日期列,用于标识价格何时有效。这样一个条款可以有多个价格记录(但只有一个会被认为是“有效的”I.E.具有最新有效日期的那个)。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美元的正确价格。
答案 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