处理日期/时间时的复合主键或代理

时间:2012-01-13 01:11:47

标签: mysql foreign-keys primary-key composite-primary-key

我已经看过很多关于此的讨论。我只是在寻求你的建议。基本上,我使用的是PHP和MySQL。我有一个users表格:

         users
------------------------------
uid(pk) | username | password
------------------------------
   12   |  user1   | hashedpw
------------------------------

和另一个存储用户更新的表

                updates
--------------------------------------------
uid |        date         |     content
--------------------------------------------
 12 | 2011-11-17 08:21:01 | updated profile
 12 | 2011-11-17 11:42:01 | created group
--------------------------------------------

用户的个人资料页面将显示用户的5个最新更新。问题是:

  1. 对于updates表,是否可以同时设置 uid 日期 作为复合主键, uid 引用users
  2. 中的 uid
  3. 或者最好在updates中创建另一个自动递增的列,并将其用作主键(而在users中uid将是FK到uid?)

2 个答案:

答案 0 :(得分:2)

您的想法(在1.下)基于这样的假设:用户永远不会在一秒内完成两次“更新”。这是非常糟糕的设计。你永远不知道将来会实现什么功能,但有可能在某一天点击会导致2个动作,因此在这个表中有2行。

我说引用了“更新”,因为我更多地将其视为日志记录表。谁知道你将来可能想要记录什么。

对于不寻常的主键:不要这样做,它几乎总是回到你的脸上,你必须做很多工作才能在之后添加一个合适的自动增量键。

答案 1 :(得分:0)

这取决于要求,但第三种可能性是您可以制作密钥(uid,日期,内容)。您仍然可以添加代理键,但在这种情况下,您可能希望实现两个键 - 复合和代理 - 而不仅仅是一个。不要错误地认为你必须做出任何一种选择。

添加代理是否有用取决于它的使用方式 - 除非您需要,否则不要添加代理。在任何情况下,我都会假设是一个引用users表的外键。