数据库设计:如何强制执行完整性

时间:2011-11-01 04:22:26

标签: mysql database database-design

假设我想记录数据库中活动日志中的某些内容。在某些情况下,这些活动与用户(例如,用户创建的东西)相关联。在某些情况下,这些活动由应用程序自动完成(例如,系统由于某种原因更新了某些记录)。我希望能够跟踪谁在系统中做了什么。跟踪用户的行为似乎很简单:

TABLE: user
- user_id (PK)

TABLE: activity_log
- activity_log_id (PK)
- user_id (FK)

上述设计允许我将每个活动与特定用户相关联(因此,强制参照完整性)。但是,如果这是采取行动的系统呢?它没有user_id我可以插入activity_log

我应该:

  • 即使在0表格中不存在activity_log.user_id,也可以0作为user插入代表系统? InnoDB不会让我这样做,对吗?
  • 专门创建一个用户来代表系统。问题是我的应用程序中的每个帐户所有者可能需要它自己的“系统用户”,这样我以后可以区分一个帐户的系统用户而不是另一个帐户的系统用户。也许这可能会变得丑陋。不确定。

建议?

2 个答案:

答案 0 :(得分:1)

您可以允许activity_log.user_id包含NULL,然后NULL表示没有用户执行该操作,“no user”表示“系统执行了”。

如果您不想使用NULL来表示“系统执行了”,那么您可以将用户添加到您的users表中,并将该用户用作“系统执行它”的占位符。

答案 1 :(得分:0)

在日志记录和审核应用程序中强制引用完整性的一个问题是您无法删除用户。 (或者你正在审计的任何事情。)你可以为这两种情况做出好的论据,

  • 忍受该限制,或
  • 删除该引用约束。