Database 我们是在表中记录重复的数据,还是在将来的所有读取中继续连接?

Database 我们是在表中记录重复的数据,还是在将来的所有读取中继续连接?,database,database-design,Database,Database Design,比如说用户活动表。至少你需要像用户id、日期时间、活动id、对象id等这样的东西。我可以加入对象表来找到对象所有者。我可以加入活动表以查找活动组、类型等 或 我也可以在运行时将这些详细信息复制到活动表中。这只意味着重复数据,但在将来,每当我需要读取时,我不必继续加入。我的所有数据现在都在活动表中,用于所有可能的数据片段 如果我复制了数据,我是用FK还是standalone来复制它?在您的案例中,您所说的是“或” 由于关系数据库基本上是为执行联接而设计的,因此通常很少有理由将重复数据反规范化并存储

比如说用户活动表。至少你需要像用户id、日期时间、活动id、对象id等这样的东西。我可以加入对象表来找到对象所有者。我可以加入活动表以查找活动组、类型等

我也可以在运行时将这些详细信息复制到活动表中。这只意味着重复数据,但在将来,每当我需要读取时,我不必继续加入。我的所有数据现在都在活动表中,用于所有可能的数据片段


如果我复制了数据,我是用FK还是standalone来复制它?

在您的案例中,您所说的是“或”


由于关系数据库基本上是为执行联接而设计的,因此通常很少有理由将重复数据反规范化并存储在一个大的宽表中。存在一些边缘情况和折衷,但在您使用的示例中,它们并不真正适用,因此我建议您坚持使用列出的“活动”、“用户活动”的三表方法,对象。

当然,数据库应该规范化,因为它们的性能更好,SQL是为规范化结构设计的,并用于连接它们。没有理由去正常化

然而,有一个案例有特殊的需要。历史记录表或日志。需要考虑的问题是,当您查询此表时,是否需要来自父对象的当前数据;或者这是当时发生的事情的真实日志,您需要创建日志行时的当前数据

在后一种情况下,由于存储此类数据有明确的目的,因此它实际上不是重复的,也不是正常化的逆转;因此,将数据分类为重复数据或非标准化数据是不正确的。这只是审计数据,必须保留。一般来说,记录文件就是它们真正的样子;为了方便起见,我们将它们存储在数据库中,因为它们不是数据库的一部分,并且数据库规则不适用

但始终对其执行指标,并定期清理;否则就会变成怪物

日志文件的替代方法是历史记录表。这不是操作的日志文件,而是根据需要在表的基础上实现的。对于必须保留变更审核的每个表,将执行该表的副本。这将存储已更改行的前映像。DDL与源表完全相同,加上一项:PK添加了一个TIMESTAMP或DATETIME列。这也是明确的要求,将这些表归类为重复表或非标准化表是不正确的

历史记录表优于日志文件,因为它们只存储已更改的行;而日志文件重复存储不变的数据。结果存储的数据量大不相同


在实践中,构建审计/历史记录表的一种非常常见的方法涉及两个或三个额外的列:1上述时间戳。2导致更改的用户列。3对于必须通过接口提供给其他系统(如数据仓库)的表,INS/DEL/UPD_OLD/UPD_NEW标志后一个标志通常是一个子集,例如,您不需要在审核表中存储UPD_OLD值,您可以将UPD_NEW和INS合并到一个新表中。第三列使仓库提要更容易进行,而无需对主表进行繁琐的查询。@DVK。哦,我肯定有各种各样的做法。2在质量合理的数据库中,UpdateUser已在数据表中;因此,它作为数据携带到历史记录表中,不需要额外的列。明确地说,数据表包含最后一个UpdatedUser和UpdatedTM;历史记录表包含所有前一行的before映像,以及AuditDtm。参考我答案中的链接。3那么,如果a这不是数据仓库问题,b标志不在历史记录表中,我们为什么要讨论它?另外,我使用的数据仓库是由UpdatedDtm驱动的,在源数据库中不需要标志。@DVK。呃,因为审核员要求,要识别更改当前行的无用用户,;历史记录表可能存在,也可能不存在,因此它必须位于主表中。我的职责范围内的标准做法。有很多大型仓库,它们的运作你显然不知道;不要进行你显然认为常见的操作。并在非仓库问题中详细说明。@DVK。1当然可以。你知道审计员的事。当然和银行系统。你为什么不发一个新问题?我可以回答你所有的问题。评论是限制性的。3我仍然可以在评论1中看到您对DWs的引用。这是一个令人担忧的麻烦。把它交给有经验的SQL程序员。谢谢。我添加了一个链接,如果你感兴趣的话。