数据库主键和验证

时间:2014-11-04 18:12:35

标签: database validation database-design primary-key

“你好,我是大学生,正在学习计算机。我正在做我的课程(需要创建一个数据库),我希望你能为我清楚一些事情。附注:没有特定的编程。

1)你可以使用字符串作为主键,即MemberName吗? 2)主键是否需要在其名称中包含“ID”? 3)如果您使用Names作为主键,您是否可以使用验证技术来确保每个名称都是唯一的?

我目前完成了大部分课程,假设我可以使用名称作为主键和验证来确保它们是唯一的,因为我们在课程作业之前创建的示例数据库运行的原理相同。然而,我的老师(一位新老师)告诉我,我需要重新开展工作,而我正在努力找到一条不得不重新做一切的方法,因为我已经咨询了我们的学习资源而且不能找到任何理由必须使用整数作为主键或任何无法使用验证的原因。

3 个答案:

答案 0 :(得分:3)

以下是一些快速解答

  1. 您可以使用字符串作为主键,但这通常是个坏主意。主键通常是索引的,并且使用数值通常意味着主键在字节方面较小,因此在创建索引时占用较少的存储空间,并且在连接期间执行速度较快或作为可能创建的其他索引的一部分执行。在可以改变的事物上定义关键字通常也是一个坏主意。如果您在MemeberName上定义一个键并且用户想要更改它,那么由于其他表可能会将您的MemberName主键作为该表中的外键引用而变得很难进行更改。

  2. 列的名称对是否可以将其定义为主键没有影响。您甚至可以将多个列定义为主键(称为复合主键),只要列集合产生唯一记录即可。

  3. 数据库在尝试插入重复的主键时会出错,但如果使用基于数据输入的字符串值,则最好在插入之前检查它是否存在。

答案 1 :(得分:1)

1)您可以将字符串列作为主键,但正如已经指出的那样,这是不明智的。值可以更改,使引用它的任何键的键无效,并且通常需要删除数据行并使用新键重新插入。密钥的存储也不太可能有效。 64位标识符(典型情况)将使用比长度超过8个ASCII字符的任何名称更少的空间。链接到主键的任何查询都将在键之间进行比较,如果它们与硬件对齐(几乎可以肯定是64位),那么它们将是最有效的。

2)命名约定可能非常强大,因此在列名中包含一个指示符以表明它是主键是明智的。我个人不喜欢使用ID,因为我有太多的数据库有一个实际的ID字段(如员工ID发出的Y / N),这会引起混淆。我更喜欢PK_tablename作为主键名(和链接到它的外键的FK_tablename),但从SQL的角度来看,包括名称中的任何标准都是可选的。

3)你可以使用验证技术来确保插入前的唯一性,但这是另一个反对使用除了无意义数字之外的任何东西的论据。使用密钥很容易忽略并发问题。如果两个进程尝试同时插入相同的名称,并且每个进程首先检查是否存在(唯一性),则可能会出现死锁或其他竞争条件。几乎所有数据库都保证可以原子方式生成默认密钥数据类型(通常为64位)。这使您无论如何都可以插入一行,并确保每一行都有唯一的ID。如果将验证包装到事务中以强制同一键的并发插入按顺序排列,则可能会导致性能下降或出现其他死锁问题。

你的教授是对的。最好使用默认密钥数据类型,即使您不必这样做。

答案 2 :(得分:1)

如果在特定情况下这样做是有意义的,使用字符串作为键没有任何根本性的错误。无论数据类型如何,密钥都必须是最小唯一标识符。除了独特性和极简性之外,在选择或设计钥匙时还应注意三个其他理想特性:简洁,稳定和熟悉。在实践中,人们经常发现记住和使用单词和字母而不仅仅是数字更简单,这就是为什么字母数字标识符很常见(例如汽车牌照,航空公司航班号,座位预订号,州和国家代码,邮政编码) , 电子邮件地址)。有研究和退休证据支持这样的观点,即字母数字键比单独的数字更有用。此外,字母数字标识符通常可以比数字标识符短。

在您的情况下,如果MemberName是一个人的名字,那么很可能它不是标识符的实际选择,因为不同的人通常具有相同的名称。另一方面,在某些情况下,个人“名称”确实有意义 - 例如用户的网站登录名。您需要根据您要解决的要求来决定这些事情。