2012-01-13 67 views
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表,那会是能够以UID引用UID从同时设置UID日期作为复合主键users
  2. 或者只是在中创建另一列更好自动递增并将用作主键(虽然uid将FK在users中使用)?

回答

2

你的想法(根据1)假设用户可以从来没有在一秒内做两个“更新”。这是非常糟糕的设计。你永远不知道你将来会实现什么功能,但是有可能是因为某天第一次点击会导致2个操作,因此在这个表中有2行。

我说“更新”引用,因为我更多地将它看作一个日志表。谁知道你可能想在未来某处登录什么。

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

+0

你是对的。我想我也是在“人性化”思考。设置表格的好方法是什么?有什么建议么? – 2012-01-13 01:39:07

+1

'logid/uid/ts/eventtype/details'其中'logid'是PK自动增量,'ts'是一个时间戳列,'eventtype'是自由格式但简短(varchar 16个字符),'details'是自由格式且不会太长(varchar 1024)。按照类型+细节分割事件,可以轻松筛选“所有登录”,“所有新组”等。 – mvds 2012-01-13 01:44:03

+0

难题。谢谢您的帮助。 – 2012-01-13 01:46:40

0

这取决于需求,但第三种可能性是您可以制作关键字(uid,日期,内容)。你仍然可以添加一个代理键,但在这种情况下,你可能想要实现键 - 一个组合和一个代理 - 不只是一个。不要认为你必须做出任何一个/或选择的错误。

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