sql - 日志表中的外键......好还是坏?

标签 sql design-patterns database-design logging

这是一个设计问题。

假设我有一个用户表 {UserKey, UserName} 并且我正在记录一些用户事件。所以在日志表 {UserKey, Activity} 中,我有一个 UserKey 列。现在将日志表中的 UserKey 作为用户表的 Foriegn 键是个好主意吗?

据我所知,

优点(ForiegnKey):没有悬挂记录。

缺点(ForiegnKey):硬删除是不可能的,除非我也删除日志,这显然很糟糕。

你有什么建议?我还缺少什么?

最佳答案

Cons(ForiegnKey): hard Deletes are not possible unless i remove the logs also, which is obviosly bad.

首先,这“显然”不是坏事。这只是处理悬垂记录的一种方法。顺便说一句,您不必从客户端代码中执行此操作 - 您可以通过 ON DELETE CASCADE 引用操作将其自动化并让 DBMS 为您执行此操作。

另一种方法是使用 NULL-able FK(并可能使用 ON DELETE SET NULL)。


您根本无法保留与数据库中不再存在的用户关联的记录。悬挂记录可能会保留用户 key ,但该 key 不再有意义,甚至可以被新用户重复使用(如果您使用自动递增 ID,则不太可能,但仍有可能)。

但是您可以“退休”用户(例如,通过在用户表中设置一个标志)并仍然保留她的所有记录,并且可能有一个后台进程来清理太老而不再重要的退休用户。

无论如何,FK 是防止悬挂记录的方法,我非常不愿意放弃它。有了适当的索引,应该没有性能问题,如果您认为有,请测量并确认它确实存在,然后再做任何其他事情...

关于sql - 日志表中的外键......好还是坏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17543880/

相关文章:

mysql - 我应该将财务日志相关信息存储在不同的数据库上吗?

mysql - 理解关系属性和关联实体/表之间的区别

c# - 设计模式场景——我应该使用哪个?

mysql - 跟踪数据库表更改

基于正则表达式的 MySQL 连接

php - 初级MySQL语法错误

C# 通用运算符 - RTTI 方法

面向对象的 JavaWorld : Getters/Setters vs Builder

php - 有效管理数据变更

sql - 使用函数处理负偏移量