【问题标题】:Is it better to have userID or username in updatedBy field in database在数据库的 updatedBy 字段中使用用户 ID 或用户名是否更好
【发布时间】:2012-07-23 12:23:22
【问题描述】:

我的几乎所有表格中都有字段,例如 createdByupdatedBy。 我觉得仅供参考。

你认为我应该在那里输入用户名还是userID。因为如果我需要直接查看数据库,那可以更好地理解,否则这是一种不好的做法。

【问题讨论】:

  • 用户 ID,因为您会发现很容易关联并为您的所有表格遵循此操作,否则您将无法使用这些字段加入
  • 始终是用户 ID,因为它是对永远不会更改的用户帐户的一个引用(假设您有一个单独的用户名字段,一个 可以 更改)

标签: mysql database-design symfony doctrine-orm data-modeling


【解决方案1】:

始终使用外键来存储引用记录,在您的情况下是用户 ID。

关于如何存储的方法,这取决于你需要什么。

a) 如果您想知道谁最后更新了记录。那么你应该 在表中创建一个userID 列。

存储外键而不是其他记录总是好的,因为这样您可以关联和获取用户的所有记录。但是这种方法会有一个限制,因为您只能存储一个用户 ID,因此您只能知道谁最后更新了它。

b) 如果要存储所有记录,要知道哪个用户更新了 记录和时间,那么您应该将其存储在一对多中 关系表。例如

user_log with columns user_id, update_datetime 可能还有一个消息栏,告诉用户做了什么。

【讨论】:

    【解决方案2】:

    用户 ID。 因为它们比用户名更小更快。

    假设您的用户想要更改用户名,那么您将不需要更新所有表格,这非常有效

    【讨论】:

      【解决方案3】:

      始终使用 ID 来保持规范化的关系数据结构。这将提供更好的性能和更大的可扩展性。如果您可以包含约束,它将使其更加简洁。

      【讨论】:

        【解决方案4】:

        这并不总是坏事。捍卫您的应用需求。标准化可以很好地消除冗余。而如果速度是您可以保持原样的因素。因为加入需要时间。插入数据也意味着插入到两个表中。

        从书上讲,永远不会少,总是 +1 标准化:)

        【讨论】:

        • 表格(USER_NAME PK, other fields...) 的“标准化”程度不低于(USER_ID PK, USER_NAME AK, other fields...)。代理并不是真正的规范化 - 它们是关于实际实施。
        【解决方案5】:

        使用以后无法更改的内容。 user_id 通常是这样。

        在特殊情况下,您可能希望将姓名存储在addition中(以便能够显示当时用户的姓名,在她结婚之前,或者从那时起的用户姓名已被删除)。但通常情况下,您会再次查询数据库以获取(当前)名称(也可以轻松缓存)。

        【讨论】:

          【解决方案6】:

          对于用户名,代理键往往是更好的选择。因此,在您的情况下,FK(createdByupdatedBy)将引用代理键(userID)而不是自然键(用户名)。

          然而,这个并不意味着代理总是优于自然键:考虑this list of criteria

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2014-08-12
            • 2016-10-09
            • 2012-03-23
            • 1970-01-01
            • 2021-03-20
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多