AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 760
Accepted
goric
goric
Asked: 2011-01-22 05:02:41 +0800 CST2011-01-22 05:02:41 +0800 CST 2011-01-22 05:02:41 +0800 CST

包含表的所有列的主键有什么好处吗?

  • 772

我有一个表,其中有四列都是不可为空的,并且数据使得需要所有四列来区分唯一记录。这意味着如果我要创建一个主键,它需要包含所有列。对表的查询几乎总是拉回一条记录,即查询中的所有列都将被过滤。

由于需要搜索每一列,拥有主键对我有好处吗(除了强制记录的唯一性)?

sql-server-2005 primary-key
  • 4 4 个回答
  • 12444 Views

4 个回答

  • Voted
  1. Best Answer
    garik
    2011-01-22T05:21:22+08:002011-01-22T05:21:22+08:00

    在您的情况下,这些字段是自然键。

    代理键:

    代理键是没有“业务”意义的键,仅用于标识表中的记录。此类键要么是数据库生成的(例如:SQL Server 中的身份、Oracle 中的序列、DB2 UDB 中的序列/身份等),要么是系统生成的值(例如通过模式中的表生成)。

    自然键:

    如果键代表的属性用于独立于数据库模式的标识,则键是自然的。这基本上意味着如果人们使用它们,这些键是自然的,例如:发票号码、税号、SSN 等。

    主键的代理键与自然键

    我更喜欢添加代理键来分离业务和数据库模型管理。其他问题是在主键上使用聚集索引和非聚集索引。如果您更改表(非静态表,它具有高强度的插入或更新),如果在非单调增加的键上使用聚集索引,您将遇到性能问题。

    • 12
  2. David Spillett
    2011-01-22T05:19:46+08:002011-01-22T05:19:46+08:00

    通常建议您在这种情况下使用代理键,因此其他表中的外键(以及可能存储在外部的任何记录引用,例如它们是否承载在 http(s) 请求引用的查询字符串中)的记录)有一些东西可以参考,如果行中的数据发生变化,它不会改变。如果你这样做,那将是你的主键。

    如果您不添加这样的代理键,那么考虑到您如何描述将所有四列作为主键访问的数据将不会是一个缺点。如果您将键设置为表的聚集索引,它将有助于这样的请求,因为磁盘上的 b 树中将有一层可以向下查找给定行的数据。

    • 7
  3. Eric Humphrey - lotsahelp
    2011-01-22T06:23:14+08:002011-01-22T06:23:14+08:00

    作为主键的复合键也会遇到索引大小问题,这些问题会影响磁盘使用、io 速度和备份。您可能想在这里查看 Kimberly Tripp 关于主键和聚集索引的帖子:http ://www.sqlskills.com/BLOGS/KIMBERLY/post/The-Clustered-Index-Debate-again!.aspx

    在这种情况下,我也建议使用代理键而不是自然键。

    • 1
  4. bernd_k
    2011-01-22T06:36:14+08:002011-01-22T06:36:14+08:00

    如果您有一个表表示只有 2 列的多对多关系,这似乎是合理的。

    参照。这个问题

    但我承认,即使在这些情况下,我也会添加代理键。

    • 0

相关问题

  • 有人在实践中使用过 sqlcmd 模式吗?[关闭]

  • 如何在不安装新实例的情况下更改 MS SQL 2005 中的实例名称?

  • 使用 UUID 或 GUID 作为主键有什么缺点?

  • 字符与整数主键

  • 从 SQL Server 2008 降级到 2005

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    您如何显示在 Oracle 数据库上执行的 SQL?

    • 2 个回答
  • Marko Smith

    如何选择每组的第一行?

    • 6 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    我可以查看在 SQL Server 数据库上运行的历史查询吗?

    • 6 个回答
  • Marko Smith

    如何在 PostgreSQL 中使用 currval() 来获取最后插入的 id?

    • 10 个回答
  • Marko Smith

    如何在 Mac OS X 上运行 psql?

    • 11 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Marko Smith

    将数组参数传递给存储过程

    • 12 个回答
  • Martin Hope
    Manuel Leduc PostgreSQL 多列唯一约束和 NULL 值 2011-12-28 01:10:21 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Stuart Blackler 什么时候应该将主键声明为非聚集的? 2011-11-11 13:31:59 +0800 CST
  • Martin Hope
    pedrosanta 使用 psql 列出数据库权限 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    BrunoLM Guid vs INT - 哪个更好作为主键? 2011-01-05 23:46:34 +0800 CST
  • Martin Hope
    bernd_k 什么时候应该使用唯一约束而不是唯一索引? 2011-01-05 02:32:27 +0800 CST
  • Martin Hope
    Patrick 如何优化大型数据库的 mysqldump? 2011-01-04 13:13:48 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve