当前位置: 首页 > 面试题库 >

数据库“文件/ ID”的设计思路,代理键,主键等

朱运诚
2023-03-14
问题内容

因此,最近我已经看到过几次代理密钥的提及,但我不确定这是什么以及它与主密钥有何不同。

我一直以为ID是我在这样的表中的主键:

Users
    ID, Guid
    FirstName, Text
    LastName, Text
    SSN, Int

但是,维基百科将代理密钥定义为“数据库中 的代理密钥是 建模世界中的实体或数据库中对象的唯一标识符。 代理密钥不是从应用程序数据派生的 。”

根据Wikipedia的说法,ID似乎是我的代理密钥,而我的主密钥可能是SSN + ID?这是正确的吗?那是一个糟糕的餐桌设计吗?

假设表设计合理,那么对于数据没有唯一性的表,这样的事情会很不好吗?

LogEntry
    ID, Guid
    LogEntryID, Int [sql identity field +1 every time]
    LogType, Int
    Message, Text

问题答案:

不,你的ID既可以是一个代理键(这只是意味着,如人工键它不是“从应用数据导出”), 并且 它应该是你的主键,太。

主键用于唯一安全地标识表中的任何行。它必须稳定,唯一并且不能为空-“人工” ID通常具有这些属性。

我通常建议不要对主键使用“自然”或真实数据-并不是 真的有 150%的 把握 永远不会
改变吗?例如,每当女人结婚(或离婚)时,瑞士的SSN等效项就会发生变化-几乎不是理想的候选人。而且也不保证它是唯一的……

为了避免所有麻烦,只需使用一个代理(人工)ID,该ID是系统定义的,唯一的,永不更改且永远没有任何应用程序含义(除了是您的唯一ID)。

Scott Ambler在这里有一篇不错的文章,其中包含所有各种键及其含义的“词汇表”-您会发现自然键,代理键,主键等等。



 类似资料:
  • 问题内容: 我正在使用Java和Cassandra数据库开发与“论坛”相关的Web应用程序。 我需要为存储用户详细信息的行和另一组存储用户发布的内容的行构造“键”。 一种选择是获取Java语言提供的随机生成的UUID,但它们的长度为16个字节。而且由于NoSQL数据库涉及大量的非规范化,所以我担心如果密钥可以较小的大小生成是否会浪费大量的磁盘空间,RAM和其他资源。 我需要生成两种类型的密钥,一种

  • 整个想法是制作一个网站来对来自全国所有城市和学校的教师进行评分。当用户进入网站时,他将有一个选择城市的选项。选择城市后,用户有机会选择在该城市可用的学校。选择学校后,教师列表就会出现。 我想制作城市、学校和教师的表格。城市将城市名称和CID作为主键。学校应该将学校名称SID作为主键,CID作为外键。最后,教师表将有教师的姓名、教师的ID CID和SID作为外键。 所以我的问题是:学校是否有可能在选

  • 本文向大家介绍数据库中主键和外键之间的区别,包括了数据库中主键和外键之间的区别的使用技巧和注意事项,需要的朋友参考一下 在关系数据库中,键是维护两个表之间的关系或从表中唯一标识数据的最重要元素。主键用于唯一地标识数据,因此两行不能具有相同的主键。不能为空。 另一方面,外键用于维护两个表之间的关系。一个表的主表充当另一个表中的伪造键。表中的外键强制引用完整性。该表中可以有多个。 序号 键 首要的关键

  • 设计思路 实行一个进程调度策略,到底需要实现哪些基本功能对应的数据结构?首先考虑到一个无论哪种调度算法都需要选择一个就绪进程来占用CPU运行。为此我们可把就绪进程组织起来,可用队列(双向链表)、二叉树、红黑树、数组…等不同的组织方式。 在操作方面,如果需要选择一个就绪进程,就可以从基于某种组织方式的就绪进程集合中选择出一个进程执行。需要注意,这里“选择”和“出”是两个操作,选择是在集合中挑选一个“

  • 本文向大家介绍分库分表之后,id 主键如何处理?相关面试题,主要包含被问及分库分表之后,id 主键如何处理?时的应答技巧和注意事项,需要的朋友参考一下 因为要是分成多个表之后,每个表都是从 1 开始累加,这样是不对的,我们需要一个全局唯一的 id 来支持。 生成全局 id 有下面这几种方式: UUID:不适合作为主键,因为太长了,并且无序不可读,查询效率低。比较适合用于生成唯一的名字的标示比如文件