Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database 我应该在哪里分解用户记录以跟踪修订_Database_Data Structures - Fatal编程技术网

Database 我应该在哪里分解用户记录以跟踪修订

Database 我应该在哪里分解用户记录以跟踪修订,database,data-structures,Database,Data Structures,我正在建立一个员工数据库,我需要能够修改员工信息,但也要跟踪所有的修改。我应该如何构造数据库,以便能够对同一用户数据进行多个修订,但能够查询最新的修订?我看到的信息很少改变,比如姓氏,但我需要能够查询过时的值。因此,如果Jenny Smith将她的名字改为Jenny James,我需要在搜索她的旧名字时能够找到该用户的当前信息 我假设我至少需要两个表,一个包含uid,另一个包含修订。然后我会加入他们,对最新的修订提出质疑。但是,我是否应该根据数据更改的频率或数据类型进一步细分呢?我在看每个记录大

我正在建立一个员工数据库,我需要能够修改员工信息,但也要跟踪所有的修改。我应该如何构造数据库,以便能够对同一用户数据进行多个修订,但能够查询最新的修订?我看到的信息很少改变,比如姓氏,但我需要能够查询过时的值。因此,如果Jenny Smith将她的名字改为Jenny James,我需要在搜索她的旧名字时能够找到该用户的当前信息


我假设我至少需要两个表,一个包含uid,另一个包含修订。然后我会加入他们,对最新的修订提出质疑。但是,我是否应该根据数据更改的频率或数据类型进一步细分呢?我在看每个记录大约40个字段,每次更新可能只有一个或两个字段会改变。此外,我无法从数据库中删除任何数据,我需要能够回顾以前的所有记录。

一种简单的方法是添加删除标志,而不是更新记录,您可以在现有记录上设置删除标志并插入新记录

当然,如果愿意,也可以将现有记录写入存档表。但是,如果变化不频繁,而且桌子不大,我就不会费心了

要获取活动记录,请使用“where deleted=0”进行查询,当此字段上有索引时,速度影响将最小


通常情况下,这会添加一些其他字段,如修订号、记录上次更新的时间以及更新者。修订号对于获取以前的版本以及进行乐观锁定非常有用。“谁在上次和何时更新此信息”问题通常在系统运行时出现,而不是在需求收集期间出现,和是有用的字段,可以放在任何包含“主”数据的表中。

我会使用单独的表,因为这样您就可以有一个唯一的标识符,指向所有其他子记录,这些子记录也是表的主键,我想这会降低您出现数据完整性问题的可能性。例如,您有Mary Jones,她在地址表、电子邮件表和绩效评估表等中有记录。如果您在主表中添加更改记录,您将如何重新链接所有现有信息?使用单独的历史记录表,这不是问题

如果一个表中有一个已删除的字段,则必须有一个非自动生成的个人id和一个自动生成的recordid

您还可能会有人忘记使用几乎每个查询都需要的where deleted=0 where子句。(如果确实使用删除的标志字段,请帮自己一个忙,将视图设置为where deleted=0,并要求开发人员在查询中使用该视图,而不是在原始表中使用。)


对于deleted flag字段,您还需要一个触发器来确保一条且只有一条记录被标记为活动记录

@Peter Tillemans的建议是实现你要求的目标的常用方法。但是我不喜欢它

数据库的结构应该反映正在建模的真实世界事实

我将为过时的员工创建一个单独的表,只存储将来需要搜索的历史信息。通过这种方式,您可以保持真实员工数据表的干净,并且只保留必要的旧数据。此方法还将简化与搜索历史数据无关的应用程序的报告和其他功能


试想一下,当您键入
select*from employee
时,您会有一种温暖的感觉,除了当前的、正确的优点外,什么都没有

deleted
列上的索引有何帮助?如果查询引擎使用这个索引,它不需要对所有其他列进行表扫描吗?为正在搜索的字段编制索引并从搜索结果中丢弃已删除的行不是更好吗?不,它将对已删除的列使用索引扫描,然后在其他列中搜索。您可以有多个索引,查询优化器将使用数据库收集的统计信息来估计每个索引的相对性能,并将它们按顺序排列,以便首先使用预期结果最少的索引。尝试在一些查询上解释计划,看看它是如何工作的。优化器通常非常聪明,他们知道如果只有10%的记录被实际删除,那么就不值得使用索引。我会有两个表,一个是员工id不变的表,另一个是员工详细信息可变的表。该Staff details表将有一个索引字段(已删除),我将在为该工作人员插入新记录时设置该字段。当我想查询最新的版本时,我只将其限制为where deleted=0。我错过什么了吗?+1。其他答案提出了一个单独的表格,在目前只涉及一个表格的情况下就足够了。但是,当您想要跟踪多个表(如orders、orderDetails等)时,您需要添加更多的表,并且关系可能很难管理。我认为这个解决方案是最好的通用设计。我看起来至少有两个表,一个包含员工的不可变id,另一个包含可变员工信息。这样我就不必删除记录,因为每个记录都将不可变的id设置为外键。我想知道是否应该将两个表之外的记录拆分成表,在这些表中,字段按抽象类型分组,或者可能会被更新。