这是一个设计问题。
假设我有一个用户表 {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/