【问题标题】:DB Design: how to enforce integrity数据库设计:如何强制执行完整性
【发布时间】:2011-11-01 19:55:51
【问题描述】:

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

TABLE: user
- user_id (PK)

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

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

我应该:

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

建议?

【问题讨论】:

    标签: mysql database database-design


    【解决方案1】:

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

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

    【讨论】:

    • 我看不出使用 0NULL 之间的区别。问题是不能强制执行引用完整性,对吗?
    • @StackOverflowNewbie:您可以在作为 FK 的列中有 NULL,但不能有不在引用表中的非 NULL 值。
    【解决方案2】:

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

    • 遵守该限制,或
    • 删除该引用约束。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-23
      • 1970-01-01
      • 1970-01-01
      • 2019-11-07
      • 2023-03-18
      • 1970-01-01
      • 2012-07-14
      相关资源
      最近更新 更多