Database 您会在自然ID上创建关系,还是使用内部ID模拟自然ID关系?

Database 您会在自然ID上创建关系,还是使用内部ID模拟自然ID关系?,database,database-design,foreign-key-relationship,relationship,Database,Database Design,Foreign Key Relationship,Relationship,可能重复: 如果给定两个表,级别1[ID,标题,编号]级别2[ID,FKID???,标题,编号] 系统用户了解Level2与Level1的关系是基于Level1的编号的,我的问题是,您是基于内部ID建立关系并“模拟”与“编号”的关系,还是只使用“编号”字段,并使用它完成操作?与数据库ID而非自然ID相关的两个标准原因是: 很难保证自然身份在任何情况下都不会改变 通常,自然ID占用更多空间,索引效率不如数据库ID(当然,这并不难,也不快,这取决于构成自然ID的数据)。通过使用数据库ID,可以避免

可能重复:

如果给定两个表,级别1[ID,标题,编号]级别2[ID,FKID???,标题,编号]


系统用户了解Level2与Level1的关系是基于Level1的编号的,我的问题是,您是基于内部ID建立关系并“模拟”与“编号”的关系,还是只使用“编号”字段,并使用它完成操作?

与数据库ID而非自然ID相关的两个标准原因是:

  • 很难保证自然身份在任何情况下都不会改变
  • 通常,自然ID占用更多空间,索引效率不如数据库ID(当然,这并不难,也不快,这取决于构成自然ID的数据)。通过使用数据库ID,可以避免业务数据的重复

  • 基于数据库ID而非自然ID进行关联的两个标准原因是:

  • 很难保证自然身份在任何情况下都不会改变
  • 通常,自然ID占用更多空间,索引效率不如数据库ID(当然,这并不难,也不快,这取决于构成自然ID的数据)。通过使用数据库ID,可以避免业务数据的重复

  • 这场讨论在这里被打得死去活来。很少有人只维护自然密钥,大多数人鼓励使用代理密钥。有人说两者都可以,这当然是真的(使用自然键以便强制执行业务规则)

    如果自然键真的是一个键,我会三思而后行(大多数时候不是)。如果是,我就用它

    但是,事实上,大多数自然关键点都不是关键点,并且由于各种原因会有重复的关键点。例如,在发放国民身份证的国家,经常会发现两个人拥有相同的身份证号码

    也就是说,如果我选择代理键路径,我会像这样设置表

    Level1 [ID, Title, Number] Level2 [ID, FKID references Level1] 级别1[ID,标题,编号]级别2[ID,FKID参考级别1]
    无需将标题和编号存储两次。

    这场讨论在这里被打得死去活来。很少有人只维护自然密钥,大多数人鼓励使用代理密钥。有人说两者都可以,这当然是真的(使用自然键以便强制执行业务规则)

    如果自然键真的是一个键,我会三思而后行(大多数时候不是)。如果是,我就用它

    但是,事实上,大多数自然关键点都不是关键点,并且由于各种原因会有重复的关键点。例如,在发放国民身份证的国家,经常会发现两个人拥有相同的身份证号码

    也就是说,如果我选择代理键路径,我会像这样设置表

    Level1 [ID, Title, Number] Level2 [ID, FKID references Level1] 级别1[ID,标题,编号]级别2[ID,FKID参考级别1]
    不需要将标题和编号存储两次。

    我想这已经被讨论过很多次了

    使用标识/自动编号作为外键几乎总是比较安全的。

    大多数自然关键点都可以复制(即使出错)


    在我的国家,我们甚至在个人身份证号码X-)方面存在问题。

    我想这已经被讨论过很多次了

    使用标识/自动编号作为外键几乎总是比较安全的。

    大多数自然关键点都可以复制(即使出错)


    在我的国家,我们甚至对X-)的个人ID号存在问题。

    如果“数字”列可以用于以自然方式关联两个表,我不会强制基于内部(代理)键的关系

    一方面,“Number”列可能足够好,这样就不会浪费ID列的空间。另一方面,如果“Number”列没有正确的特征(可能会更改、可能很难索引等),那么代理项ID可能是更好的选择


    这一切归结为“Number”列的语义。

    如果“Number”列可以用于以自然的方式关联两个表,我不会强制基于内部(代理)键的关系

    一方面,“Number”列可能足够好,这样就不会浪费ID列的空间。另一方面,如果“Number”列没有正确的特征(可能会更改、可能很难索引等),那么代理项ID可能是更好的选择

    这一切归结为“数字”列的语义。

    • 有时,最好使用天然药物 如果(例如SSN,或 员工ID)您可以放心 稳定

    • 使用代理关键点时,FK是 本质上是一种一对一的关系 系统生成的#,到另一个系统 生成#。在极端情况下 人为的关系可能是 与现实完全不同步

    • 其他海报也评论了当自然钥匙必须更换时会发生的混乱。当然这是个问题。但值得研究的是,在每种情况下,这些异常发生的频率有多高——尾巴(异常)是否会摇动狗(你的设计)

    • 我并不热衷于此,但我确实同意在同一个db中混合使用自然键和代理键会带来不同的约定

    • 如果自然关键点是多个字段 ,说出出生日期+姓氏+ 部门(或类似部门) 然后你最好使用 人造钥匙

    以上所有参数都在数据模型的逻辑级别上。在物理层面上,您的情况、服务器和性能约束将决定您的决策。最好不要过早优化。

    • 有时,最好使用天然药物 如果(例如SSN,或 雇用