0

我看过很多关于这个的讨论。我只是在寻求您对此的建议。基本上,我使用的是 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表,是否可以将uiddate设置为复合主键,其中uid引用uidusers
  2. 或者最好只创建另一个updates自动递增的列并将用作主键(而 uid 将是 FK 到 uid in users)?
4

2 回答 2

2

您的想法(低于 1.)基于用户永远不能在一秒钟内进行两次“更新”的假设。那是非常糟糕的设计。你永远不知道你将来会实现什么功能,但很可能有一天 1 次点击会导致 2 次操作,因此该表中有 2 行。

我说引用“更新”是因为我将其更多地视为一个日志记录表。谁知道您将来可能想在某个地方记录什么。

至于不寻常的主键:不要这样做,它几乎总是会出现在您的面前,并且您必须做很多工作才能在之后添加适当的自动增量键。

于 2012-01-13T01:19:26.303 回答
0

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

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

于 2012-01-13T06:47:09.347 回答