sql - 为主键选择数据类型时应该考虑什么?

标签 sql database-design

当我创建一个新的数据库表时,在选择主键的数据类型时应该考虑哪些因素?

最佳答案

很抱歉这样做,但我发现我对相关问题的回答(您可以查看 thisthis )可以适用于这个问题。我对它们进行了一些改造...

您会发现很多帖子都涉及这个问题,您所做的每个选择都有其优点和缺点。这些参数通常是指关系数据库理论和数据库性能。

关于这个问题,我的观点很简单:代理主键始终有效 , 而 这些天中的自然键可能并不总是有效 ,这有多种原因:字段太短、规则更改等。

至此,你已经猜到我基本上是 uniqueIdentifier/surrogate 主键团队的成员,即使我欣赏和理解这里提出的论点,我仍然在寻找“自然”的情况 key 比代理更好......

除此之外,支持此基本规则的最重要但总是被遗忘的论点之一与 有关。代码规范化和生产力 :

每次创建表时,我要不要浪费时间

  • 识别其主键及其物理特征(类型、大小)
  • 每次我想在我的代码中引用它时都记住这些特征吗?
  • 向团队中的其他开发人员解释我的 PK 选择?

  • 我的答案是否定的 所有这些问题:
  • 当代理选项为我提供防弹解决方案时,我没有时间尝试确定“最佳自然主键”。
  • 我不想在编写代码时记住我的 Table_whatever 的主键是一个 10 个字符长的字符串。
  • 我不想浪费时间协商自然 key 长度:“好吧,如果您需要 10,为什么不采取 12 以确保安全 ?”。此 “安全起见”争论真的让我很恼火:如果你想留在安全的一边,就意味着你真的离不安全的一边不远了!选择代理:它是防弹的!

  • 所以在过去的五年里,我一直遵循一个非常基本的规则:每个表(我们称之为“myTable”)都有它的第一个字段,称为 'id_MyTable'。这是 uniqueIdentifier 类型。即使这个表支持“多对多”关系,其中字段组合提供了一个非常可接受的主键,我更喜欢创建这个 'id_myManyToManyTable' field 是一个 uniqueIdentifier,只是为了遵守规则,因为,最后,它没有伤害。

    主要优点是您不必再关心代码中主键和/或外键的使用。获得表名后,您就知道 PK 名称和类型。一旦您知道在您的数据模型中实现了哪些链接,您就会知道表中可用外键的名称。

    如果你仍然想在你的 table 上的某个地方有你的“自然 key ”,我建议你按照标准模型来构建它,比如
    Tbl_whatever
    
       id_whatever, unique identifier, primary key
       code_whatever, whateverTypeYouWant(whateverLengthYouEstimateTheRightOne), indexed
       .....
    

    其中 id_ 是主键的前缀,code_ 用于“自然”索引字段。有些人会争辩说 code_ 字段应该设置为唯一的。确实如此,并且可以通过 DDL 或外部代码轻松管理。注意很多“自然”键是计算出来的(发票号),所以已经通过代码生成了

    我不确定我的规则是最好的。但这是一种非常有效的方法!如果每个人都在应用它,例如,我们将避免浪费时间回答此类问题!

    关于sql - 为主键选择数据类型时应该考虑什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/230351/

    相关文章:

    sql - 为两个字段创建两个数组,保持数组的排序顺序同步(没有子查询)

    mysql - 从父级递归继承的属性

    java - 如何使用 hibernate 在 java 中正确实现 owner-owned-owner2 关联?

    ruby-on-rails - Ruby on Rails 中的自定义字段/表单

    database - 在数据库中使用数组是不是糟糕的设计?

    c# - 在 c# 代码中使用 dapper 将输出参数传递给存储过程

    MySQL 全文搜索无法正常工作。为什么?

    php - 我如何修改此 MySQL 查询来查找排名?

    mysql - 为什么我收到 errno : 150 "Foreign key constraint is incorrectly formed"?

    java - 保存并在mongodb中查找json字符串