在数据库中创建新表时,使用id的重要性是什么。出于我们的目的,我们在每个字段中使用唯一的用户名和电子邮件,以将信息与唯一的用户名或电子邮件相匹配。那么id的用途是什么?
另外,长度/值字段是多少?新的。
感谢一帮!
答案 0 :(得分:8)
id
字段是surrogate key的示例。使用代理键作为数据库中的主键是一个好主意,因为它与现实世界中的外部事件完全无关,因此不受其影响。
使用电子邮件地址等natural key可能会导致问题,因为如果用户更改了自己的电子邮件地址,您的密钥将不得不更改。这会造成困难,因为它会打破外键的限制。它还将使查询与特定用户相关的事件随着时间的推移变得更加困难,因为您没有保证与该用户的整个历史记录一致的单个密钥。
如果您的公司中有多个需要密钥的数据库,或者您将数据从数据库导出到其他应用程序或系统,那么当您更改数据库中的密钥时,您可能还需要更改这些系统中的密钥也是使用ON CASCADE UPDATE无法自动完成的事情。
答案 1 :(得分:4)
正如其他人所指出的,记录有两种类型的键:自然键和代理(人工)键。那么,两个主要问题是:您是否需要使用代理密钥,如果是,那该代理密钥应该是什么?
关于第一个问题:如果您没有有效的surrogate key用作natural key,那么仅需要使用primary key。所有理智的数据库系统都支持'ON UPDATE CASCADE'子句,这意味着如果您正在使用恰好更改的自然键,则更改将传播到声明为引用它的所有 。当然,如果您的数据库系统不支持foreign keys,那么最好的办法是使用代理键,如果只是为了解决数据库系统中缺少的功能(而代理键将使您的数据库更容易根据这一事实进行一致性检查)。也就是说,如果您正在设计一个具有高正常运行时间和高稳健性要求的应用程序,请选择能够正确识别外键的数据库实现,否则您很可能会发现数据完整性错误将在开发后期(甚至是维护中)发现并且你必须编写实用程序来检查你的数据在各种失败模式下的一致性。
对于第二个问题:如果您使用代理键,特别是如果您正在解决数据库系统的缺陷,则始终将其视为不可变和全球唯一。 始终。这将在以后的许多情况下提供帮助:公司可以合并(和拆分),数据库可以合并(和拆分),并且可能发生大约一百万个其他情况,这些情况在如果代理键不是全局唯一的,则设计的数据库能够导致问题。由于代理键与它们所持有的数据完全无关(它们与表中的其他字段没有任何关系,除了你赋予它的人工字段),这是最好的方式。由于这些原因,当我必须使用代理键时,我使用UUID(基本上是128位整数,但不是增量)。现在,您不必担心在发生意外事件时重新编号记录编号和引用。 (是的,它确实减慢了速度,特别是如果您的服务器在32位平台上运行。但是如果您需要处理更多负载,更好地分配负载---不要为了速度而牺牲完整性,永远< / em>,当您处理重要数据时!)
答案 2 :(得分:3)
表格之间的关系。
无效与username
或email
地址有关,因为这是string
并且比较这些值需要更多时间,并且索引更大,最佳解决方案是将ID
添加为主键,以便与userid
等其他表的关系。
答案 3 :(得分:0)
虽然您希望用户名是唯一的,但您不应该依赖数据库来控制唯一性。最好的做法是让您的代码测试数据库中是否已存在用户名和电子邮件。
长度的目的是限制数据的输入。例如,长度为10的varchar只允许10个字符长度的输入。值用于默认目的。如果在未声明此字段的情况下插入新行,则会自动填充该值(如果已设置)。
答案 4 :(得分:0)
重点是减轻指数。如果您不使用身份字段并选择使用(用户名,电子邮件)作为主键,搜索用户将花费更多时间查找用户名firt,然后查找电子邮件。此外,这些字段是字符串,您无法比较整数的大小和用户名和电子邮件等字符串的大小。
使用身份字段可以让您执行Comments (id, user_id)
而不是Comments (id, username, email)
......