有什么情况我们没有任何主键吗?

时间:2012-11-27 16:06:56

标签: php mysql login

我最近阅读了一篇关于创建安全php登录系统的文章,该系统将逐步引导,现在这个问题告诉我为什么在本文中login_attempts表中没有主键。 我谈过的文章: this article

Create the "login_attempts" table:
CREATE TABLE `secure_login`.`login_attempts` (
  `user_id` int(11) NOT NULL,
  `time` VARCHAR(30) NOT NULL 
) ENGINE=InnoDB

请转到第4步

  

创建一个表来存储登录尝试。

然后问题就像标题一样清楚。是否有任何情况我们没有任何主键?

5 个答案:

答案 0 :(得分:3)

是的,但您需要至少在列INDEX上添加非唯一 User_ID,以提高查询表时的性能。

ALTER TABLE login_attempts ADD INDEX idx_userID (User_ID)

答案 1 :(得分:1)

主键的关键是提供一些值,您可以在其中索引有关性能的唯一值的数据。在您所拥有的情况下,可能存在两列都不是唯一的可能性。假设您的登录是多线程的,虽然很小,但是很多用户都有相同的time登录,将主键放在上面显然会拒绝某人或导致错误。如果您将主键放在user_id上,那么您将拒绝同一用户多次尝试。

在其他情况下,例如与外键之间的表创建多对多关系,您可以做类似的事情。

免责声明我确信有人可以提供更强有力的解释,但这是我的理解。

答案 2 :(得分:0)

默认情况下不需要主键 - 它取决于表的eache行是否必须是可识别的,例如当它在其他表中用作外键时。

在这种特定情况下,我会说user_id已经足够了 - 但它应该被编入索引,因为您最有可能想要使用该列进行选择。

答案 3 :(得分:0)

极少数情况下不需要主键。想象一下,如果你想删除一个特定的行,你怎么能删除正确的行?同时进行两次登录尝试会插入两个相同的行。

答案 4 :(得分:0)

主键是一个数据库管理工具,它已成为保持数据库注册表中一致信息的支柱。但是,只要有一个清晰安全的机制来保持数据库表中所需的信息一致性,它们就可以省去。 。在DB级别,您可以处置主键。但是在逻辑层面上,你必须有一个机制,可以帮助你区分不同的注册表,这本身就是主键是什么的实用概念...所以基本上:如果你需要有一致的信息,你永远不能处置PKs,在逻辑层面..

在我目前的工作中,我成为了GPS跟踪系统的dba,我发现所有的信息都在MySQL中。我得到了这个项目'按原样',几乎没有文档,也没有起点,但要完成很多任务。我的第一个想法是扫描数据库架构。而且我发现所有桌子都没有PK ......甚至没有接近Database Normalization Basics。它是一个没有PK或FK的关系数据库,但是它可以运行,为数千个GPS设备提供服务。

当然,这种数据库模式很容易出现故障,但公司会以一种非常原始的方式保持信息的一致性。

所以...我选择重做数据库模式,并将所有信息迁移到基于自动增量PK,约束和完整性触发器的新的规范化模式,开发用于处理所有数据库数据的MVC应用程序,我面临相当大的挑战:我有史以来第一次专业项目。

作为我个人经历的结论。主键是保持信息一致,真实和有组织的标准指南。您可以随时处置它们,但使用它们将为您节省大量完全不必要的设计和实现工作。