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