Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/238.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在数据库中使用ID_Php_Mysql_Database_Phpmyadmin - Fatal编程技术网

Php 在数据库中使用ID

Php 在数据库中使用ID,php,mysql,database,phpmyadmin,Php,Mysql,Database,Phpmyadmin,在数据库中创建新表时,使用id的重要性是什么。出于我们的目的,我们在每个字段中使用唯一的用户名和电子邮件来将信息与唯一的用户名或电子邮件相匹配。那么id有什么用呢 另外,长度/值字段的用途是什么?这是新的 非常感谢 表之间的关系。 无效与用户名或电子邮件地址有关,因为这是一个字符串,比较此值需要更多时间,索引也更大,最佳解决方案是添加ID,就像添加与其他表的关系的主键一样,如userid,ID字段就是一个示例。在数据库中使用代理键作为主键是一个好主意,因为它与真实世界中的外部事件完全无关,因此不

在数据库中创建新表时,使用id的重要性是什么。出于我们的目的,我们在每个字段中使用唯一的用户名和电子邮件来将信息与唯一的用户名或电子邮件相匹配。那么id有什么用呢

另外,长度/值字段的用途是什么?这是新的


非常感谢

表之间的关系。


无效与
用户名
电子邮件
地址有关,因为这是一个
字符串
,比较此值需要更多时间,索引也更大,最佳解决方案是添加
ID
,就像添加与其他表的关系的主键一样,如
userid
ID
字段就是一个示例。在数据库中使用代理键作为主键是一个好主意,因为它与真实世界中的外部事件完全无关,因此不受外部事件的影响

使用诸如电子邮件地址之类的密码可能会导致问题,因为如果用户更改其电子邮件地址,则必须更改密钥。这会造成困难,因为它会破坏外键约束。它还将使查询与特定用户相关的事件变得更加困难,因为您没有保证该用户的整个历史记录一致的单一密钥


如果您的公司中有多个数据库需要密钥,或者您将数据从数据库导出到其他应用程序或系统,那么当您更改数据库中的密钥时,您也可能需要更改这些系统中的密钥,某些无法通过使用ON CASCADE UPDATE自动完成的操作。

尽管您希望用户名是唯一的,但不应依赖数据库来控制唯一性。测试数据库中是否已经存在用户名和电子邮件是代码的最佳实践


长度的目的是限制数据的输入。例如,长度为10的varchar只允许输入10个字符的长度。值用于默认目的。如果插入新行而不声明此字段,则该字段将自动填充值(如果已设置)。

关键是要减轻索引。如果您不使用标识字段,而选择使用(用户名、电子邮件)作为主键,则搜索用户将花费更多的时间首先查找用户名,然后再查找电子邮件。此外,这些字段是字符串,您无法比较整数的大小和字符串(如用户名和电子邮件)的大小


使用标识字段将允许您执行类似于
注释(id,user\u id)
的操作,而不是
注释(id,username,email)

正如其他人所指出的,有两种类型的记录键:自然键和代理(人工)键。那么,两个主要问题是:您需要使用代理密钥吗?如果需要,代理密钥应该是什么

关于第一个问题:如果您桌上没有可用作a的有效文件,您只需要使用a。所有sane数据库系统都支持“ON UPDATE”子句,这意味着如果您使用的是发生更改的自然密钥,则更改将传播到声明引用它的所有对象。当然,如果您的数据库系统不支持,那么您最好使用代理密钥,如果只是为了解决数据库系统中缺乏功能的问题(根据这一事实,代理密钥将使您的数据库更容易进行一致性检查)。这就是说,如果您设计的应用程序需要高正常运行时间和高健壮性,请选择一个能够正确获取外键的数据库实现,否则您很可能会发现数据完整性错误将在开发后期(甚至在维护中)被发现您必须编写实用程序来检查数据在各种故障模式下的一致性


对于第二个问题:如果您使用代理密钥,特别是如果您正在解决数据库系统的缺陷,则应始终将其视为不可变且全局唯一的始终。这将在以后的许多情况下提供帮助:公司可以合并(和拆分),数据库可以合并(和拆分),并且在设计数据库时可能会发生约100万种其他情况,这些情况在代理项不是全局唯一的情况下可能会导致问题。由于代理键与它们所持有的数据没有任何关系(它们与表中的其他字段没有任何关系,除了您赋予它的人工字段),所以最好这样做。出于这些原因,当我必须使用代理密钥时,我使用UUID(本质上是128位整数,但不是增量)。现在,您不必担心在发生意外事件时重新编号记录编号和引用。(是的,它确实会减慢速度,特别是当您的服务器运行在32位平台上时。但是如果您需要处理更多负载,请更好地分配负载--在处理重要数据时,永远不要为了速度而牺牲完整性!)

+1:我曾经遇到过这种情况,我们将电子邮件用作用户数据库的密钥,这意味着用户不能更改用户名,除非我们做了大量工作来跟踪代码中的所有依赖项。管理层认为这不值得,他们坚持你不能更改用户名的政策,你必须创建一个新帐户(或者只使用旧的电子邮件地址),因此,在这种情况下,我也可以使用一个新字段,使其所有数字都是唯一的,我可以将其作为每个用户的唯一标记。@Juan yes。我现在使用的代码是我不久前写的。我也遇到过同样的情况,只是我编写了代码,在用户名或电子邮件发生更改时更新每个数据库。我知道这很耗时也很愚蠢。嗯,只是学习。你们真是帮了大忙。所有设计良好的数据库系统都实现了“ON update”