精华内容
下载资源
问答
  • 主键是非常不幸的符号,因为“初级”的内涵和与逻辑模型有关的潜意识联想。 因此我避免使用它。 相反,我指的是物理模型的代理键和逻辑模型的自然键。重要的是,每实体的逻辑模型至少具有一组“业务属性”,其包括...

    主键是非常不幸的符号,因为“初级”的内涵和与逻辑模型有关的潜意识联想。 因此我避免使用它。 相反,我指的是物理模型的代理键和逻辑模型的自然键。

    重要的是,每个实体的逻辑模型至少具有一组“业务属性”,其包括实体的密钥。 Boyce,Codd,Date等在关系模型中将这些称为候选键。 然后,当我们为这些实体构建表时,它们的候选键在这些表中成为自然键。 只有通过那些自然键,用户才能唯一地识别表中的行; 因为代理键应始终对用户隐藏。 这是因为代理键没有商业意义。

    然而,在没有代理键的情况下,我们的表的物理模型在许多情况下效率低下。 回想一下,非聚集索引的非覆盖列只能通过密钥查找(通常)找到聚簇索引(忽略作为堆积实现的表)。 当我们的可用自然密钥很宽时,这(1)扩大了我们的非聚簇叶节点的宽度,增加了存储要求,并且对非聚集索引的搜索和扫描进行了读取访问; (2)减少聚集索引的扇出,增加索引高度和索引大小,再次增加聚簇索引的读取和存储要求; (3)增加了我们的聚簇索引的缓存要求。 从缓存中追逐其他索引和数据。

    这是一个小的代理键,被指定为RDBMS作为“主键”证明是有益的。 当设置为聚类键时,为了用于从非聚集索引和相关表中的外键查找中查找聚簇索引的键,所有这些缺点都消失了。 我们的聚簇索引扇出再次增加以减少聚簇索引的高度和大小,减少聚簇索引的缓存负载,减少通过任何机制访问数据时的读取(无论是索引扫描,索引搜索,非聚簇键查找还是外键查找) 并降低表的聚簇索引和非聚簇索引的存储要求。

    请注意,仅当代理键很小且聚类键时才会发生这些好处。 如果GUID用作聚类键,则情况通常比使用最小可用自然键时更糟。 如果表被组织为堆,则8字节(堆)RowID将用于键查找,这比16字节GUID更好但性能低于4字节整数。

    如果由于业务限制必须使用GUID,那么搜索更好的群集密钥是值得的。 例如,如果一个小的站点标识符和4字节的“站点序列号”是可行的,那么该设计可能比作为代理键的GUID具有更好的性能。

    如果堆的结果(可能是散列连接)使得该首选存储成为更广泛的集群密钥的成本,则需要将其平衡到权衡分析中。

    考虑这个例子::

    ALTER TABLE Persons

    ADD CONSTRAINT pk_PersonID PRIMARY KEY (P_Id,LastName)

    其中元组“(P_Id,LastName)”需要唯一性约束,并且可能是冗长的Unicode LastName加上4字节整数,因此需要(1)声明性地将此约束强制实施为“ADD CONSTRAINT pk_PersonID UNIQUE NONCLUSTERED(P_Id) ,LastName)“和(2)分别声明一个小的代理键作为聚簇索引的”主键“。 值得注意的是,Anita可能只希望将LastName添加到此约束中以使其成为覆盖字段,这在聚簇索引中是不必要的,因为所有字段都被它覆盖。

    SQL Server将主键指定为非聚簇的能力是一个不幸的历史情况,因为“首选自然或候选键”(来自逻辑模型)与“物理存储中的查找键”的含义相混淆 模型。 我的理解是,最初SYBASE SQL Server总是使用4字节的RowID,无论是作为堆还是聚簇索引,作为物理模型中的“存储中的查找键”。

    展开全文
  • 转自:http://blog.csdn.net/for12/article/details/49300843今天共工作,做老项目维护的时候无意发现一张表居然个主键。吓死宝宝了,然后尝试着建表建主键,但是都不能成功。难道是我写的问题,最后通过查...

    转自:http://blog.csdn.net/for12/article/details/49300843

    今天在共工作,做老项目维护的时候无意中发现一张表居然有三个主键。吓死宝宝了,然后尝试着建表建主键,但是都不能成功。

    doubt.gif

    难道是我写的有问题,最后通过查资料总终于解决了。

    1、数据库的每张表只能有一个主键,不可能有多个主键。

    2、所谓的一张表多个主键,我们称之为联合主键。

    注:联合主键:就是用多个字段一起作为一张表的主键。

    3、主键的主键的作用是保证数据的唯一性和完整性,同时通过主键检索表能够增加检索速度。

    下面聊聊怎么创建联合主键:

    1、GUI中同时选中多列,点击设置为主键。

    2、sql语句将多列设置为主键:

    一种是在建表时就写出,语句如下:

    Create Table 表名 (字段名1 Int Not Null,

    字段名2 nvarchar(13) Not Null Primary Key (字段名1, 字段名2),

    字段名3…………

    字段名N………… )

    另一种是在建表后更改,语句如下:

    ALTER TABLE 表名 WITH NOCHECK ADD

    CONSTRAINT [PK_表名] PRIMARY KEY  NONCLUSTERED

    (

    [字段名1],

    [字段名2]

    )

    通过以上两种方式就解决了联合主键的问题。

    展开全文
  • 天对逻辑主键、业务主键和复合主键进行了一些思考,也网上搜索了一下相关的讨论,相关讨论可以看最下面的参考链接。下面是自己基于 SQL Server 做的一些总结,其他数据库(Oracle、MySQL、DB2、......)应该也...

    关于业务主键和逻辑主键的思考

    这几天对逻辑主键、业务主键和复合主键进行了一些思考,也在网上搜索了一下相关的讨论,相关讨论可以看最下面的参考链接。下面是自己基于 SQL Server 做的一些总结,其他数据库(Oracle、MySQL、DB2、......)应该也类似吧。这个只是自己一时的思考,如有不当请告知,重新思考后再修正。

    定义(部分定义来源于 SQL Server 联机丛书):

    主键(PRIMARY KEY):表通常具有包含唯一标识表中每一行的值的一列或一组列。这样的一列或多列称为表的主键 (PK),用于强制表的实体完整性。

    外键(FOREIGN KEY):外键 (FK) 是用于建立和加强两个表数据之间的链接的一列或多列。在外键引用中,当一个表的列被引用作为另一个表的主键值的列时,就在两表之间创建了链接。这个列就成为第二个表的外键。

    聚集索引:聚集索引基于数据行的键值在表内排序和存储这些数据行。每个表只能有一个聚集索引,因为数据行本身只能按一个顺序存储。

    非聚集索引:非聚集索引包含索引键值和指向表数据存储位置的行定位器。可以对表或索引视图创建多个非聚集索引。通常,设计非聚集索引是为改善经常使用的、没有建立聚集索引的查询的性能。

    自动编号列和标识符列:对于每个表,均可创建一个包含系统生成的序号值的标识符列,该序号值以唯一方式标识表中的每一行。

    业务主键(自然主键):在数据库表中把具有业务逻辑含义的字段作为主键,称为“自然主键(Natural Key)”。

    逻辑主键(代理主键):在数据库表中采用一个与当前表中逻辑信息无关的字段作为其主键,称为“代理主键”。

    复合主键(联合主键):通过两个或者多个字段的组合作为主键。

     

    原理分析:

    使用逻辑主键的主要原因是,业务主键一旦改变则系统中关联该主键的部分的修改将会是不可避免的,并且引用越多改动越大。而使用逻辑主键则只需要修改相应的业务主键相关的业务逻辑即可,减少了因为业务主键相关改变对系统的影响范围。业务逻辑的改变是不可避免的,因为“永远不变的是变化”,没有任何一个公司是一成不变的,没有任何一个业务是永远不变的。最典型的例子就是身份证升位和驾驶执照号换用身份证号的业务变更。而且现实中也确实出现了身份证号码重复的情况,这样如果用身份证号码作为主键也带来了难以处理的情况。当然应对改变,可以有很多解决方案,方案之一是做一新系统与时俱进,这对软件公司来说确实是件好事。

    使用逻辑主键的另外一个原因是,业务主键过大,不利于传输、处理和存储。我认为一般如果业务主键超过8字节就应该考虑使用逻辑主键了,因为int是4字节的,bigint是8字节的,而业务主键一般是字符串,同样是 8 字节的 bigint 和 8 字节的字符串在传输和处理上自然是 bigint 效率更高一些。想象一下 code == "12345678" 和 id == 12345678 的汇编码的不同就知道了。当然逻辑主键不一定是 int 或者 bigint ,而业务主键也不一定是字符串也可以是 int 或 datetime 等类型,同时传输的也不一定就是主键,这个就要具体分析了,但是原理类似,这里只是讨论通常情况。同时如果其他表需要引用该主键的话,也需要存储该主键,那么这个存储空间的开销也是不一样的。而且这些表的这个引用字段通常就是外键,或者通常也会建索引方便查找,这样也会造成存储空间的开销的不同,这也是需要具体分析的。

    使用逻辑主键的再一个原因是,使用 int 或者 bigint 作为外键进行联接查询,性能会比以字符串作为外键进行联接查询快。原理和上面的类似,这里不再重复。

    使用逻辑主键的再一个原因是,存在用户或维护人员误录入数据到业务主键中的问题。例如错把 RMB 录入为 RXB ,相关的引用都是引用了错误的数据,一旦需要修改则非常麻烦。如果使用逻辑主键则问题很好解决,如果使用业务主键则会影响到其他表的外键数据,当然也可以通过级联更新方式解决,但是不是所有都能级联得了的。

    使用业务主键的主要原因是,增加逻辑主键就是增加了一个业务无关的字段,而用户通常都是对于业务相关的字段进行查找(比如员工的工号,书本的 ISBN No. ),这样我们除了为逻辑主键加索引,还必须为这些业务字段加索引,这样数据库的性能就会下降,而且也增加了存储空间的开销。所以对于业务上确实不常改变的基础数据而言,使用业务主键不失是一个比较好的选择。另一方面,对于基础数据而言,一般的增、删、改都比较少,所以这部分的开销也不会太多,而如果这时候对于业务逻辑的改变有担忧的话,也是可以考虑使用逻辑主键的,这就需要具体问题具体分析了。

    使用业务主键的另外一个原因是,对于用户操作而言,都是通过业务字段进行的,所以在这些情况下,如果使用逻辑主键的话,必须要多做一次映射转换的动作。我认为这种担心是多余的,直接使用业务主键查询就能得到结果,根本不用管逻辑主键,除非业务主键本身就不唯一。另外,如果在设计的时候就考虑使用逻辑主键的话,编码的时候也是会以主键为主进行处理的,在系统内部传输、处理和存储都是相同的主键,不存在转换问题。除非现有系统是使用业务主键,要把现有系统改成使用逻辑主键,这种情况才会存在转换问题。暂时没有想到还有什么场景是存在这样的转换的。

    使用业务主键的再一个原因是,对于银行系统而言安全性比性能更加重要,这时候就会考虑使用业务主键,既可以作为主键也可以作为冗余数据,避免因为使用逻辑主键带来的关联丢失问题。如果由于某种原因导致主表和子表关联关系丢失的话,银行可是会面临无法挽回的损失的。为了杜绝这种情况的发生,业务主键需要在重要的表中有冗余存在,这种情况最好的处理方式就是直接使用业务主键了。例如身份证号、存折号、卡号等。所以通常银行系统都要求使用业务主键,这个需求并不是出于性能的考虑而是出于安全性的考虑。

    使用复合主键的主要原因和使用业务主键是相关的,通常业务主键只使用一个字段不能解决问题,那就只能使用多个字段了。例如使用姓名字段不够用了,再加个生日字段。这种使用复合主键方式效率非常低,主要原因和上面对于较大的业务主键的情况类似。另外如果其他表要与该表关联则需要引用复合主键的所有字段,这就不单纯是性能问题了,还有存储空间的问题了,当然你也可以认为这是合理的数据冗余,方便查询,但是感觉有点得不偿失。

    使用复合主键的另外一个原因是,对于关系表来说必须关联两个实体表的主键,才能表示它们之间的关系,那么可以把这两个主键联合组成复合主键即可。如果两个实体存在多个关系,可以再加一个顺序字段联合组成复合主键,但是这样就会引入业务主键的弊端。当然也可以另外对这个关系表添加一个逻辑主键,避免了业务主键的弊端,同时也方便其他表对它的引用。

    综合来说,网上大多数人是倾向于用逻辑主键的,而对于实体表用复合主键方式的应该没有多少人认同。支持业务主键的人通常有种误解,认为逻辑主键必须对用户来说有意义,其实逻辑主键只是系统内部使用的,对用户来说是无需知道的。

    结论或推论:

    1、尽量避免使用业务主键,尽量使用逻辑主键。

    2、如果要使用业务主键必须保证业务主键相关的业务逻辑改变的概率为0,并且业务主键不太大,并且业务主键不能交由用户修改。

    3、除关系表外,尽量不使用复合主键。

    使用逻辑主键的最佳实践指南:

    1、足够用就好。系统使用的生命周期以100年为限,逻辑主键数据类型采用下表规则,如果不确定则使用int类型。

    数据量 数据类型 数据大小 生成频率 备注
    < 128 tinyint 1 字节 1条/年 频率过低,不太靠谱,不建议采用
    < 3 万 smallint 2 字节 27条/月 频率较低,慎用
    < 21 亿 int 4 字节 40条/分钟 能满足大部分情况
    < 922 亿亿 bigint 8 字节 292万条/毫秒 能满足绝大部分情况 
    >= 922 亿亿 uniqueidentifier 16 字节

    100亿用户同时每毫秒生成10亿条,可以连续生成10亿年

    可用于分布式、高并发的应用

    2、一般采用自增长方式或NewID()方式。

    3、主键字段名称一般采用“表名ID”方式,方便识别和表联接。

    4、如果表存在分布式应用,则可以考虑采用不同起始值,相同步长方式自增。例如有3个部署在不同地方的库,则可以如下设计:

    起始值 步长
    1 10
    2 10
    3 10

    步长统一设置10是为了方便日后扩展,这样不同库之间也能保持主键唯一性了,也方便合并。

    5、如果存在高并发性需求或数据表迁移需求,可以考虑使用uniqueidentifier类型,并使用NewID()函数。

    6、可以考虑对业务主键建立唯一性索引,以实现业务主键唯一性的业务需求。

    7、如果需要考虑业务主键的性能需求,可以把业务主键建立聚集索引,而逻辑主键只建立主键约束和非聚集索引即可。

    8、关系表可以考虑采用复合主键方式,复合主键不用于实体表。

    参考:https://www.cnblogs.com/sparkbj/p/6015690.html

    展开全文
  • 我们使用SQL Server数据库的时候常常会创建主键和索引,那么主键和索引到底什么样的不同呢?本文我们主要介绍了主键和索引的区别。 主键和索引的区别如下: 主键是索引,但索引不一定是主键主键具有唯一性...

    我们在使用SQL Server数据库的时候常常会创建主键索引,那么主键和索引到底有什么样的不同呢?本文我们主要介绍了主键和索引的区别。

    主键和索引的区别如下:

    主键是索引,但索引不一定是主键。 

    主键具有唯一性,而只有唯一性索引才具有唯一性;主键的值不能为空,不能重复。 索引可以在程序中动态创建删除。也可以是任何有序的字段。

    如果在一个表中,列A、B、C   被设为主键的情况下,当需要将A,B,C 设为索引时,A,B,C被设为主键,数据库自动会建立索引,不需要再建索引;另外需要对列A,B,C,D,E建立索引时,不能只对D,E建立索引,必须在索引中包含所有的索引列即:A,B,C,D,E。

    主键、外键、索引:

    索引只是为了排序与加快浏览度!也可对表数据作证!一个表只能有一个主键,外键与主键差不多!两者都能将表联系起来,定义规则!

    主键,每一张表中必须有的,它是唯一的,唯一能标识每一条记录。

    外键,一张表中的外键在另一张表中只能是主键,一般情况下,要删除一张表中的主键必须首先要确保其它表中的没有相同外键(即该表中的主键没有一个外键和它相关联)   

    索引只是加快查询,排序速度,主键和外键定义后可保证数据完整性,省去编写某些触发器。主键最好每张表上都定义,小数据库用唯一索引也可以。

    每个表最好有主键,用来保证数据完整性。表的外键是另一表的主键,外键将两表联系起来。   索引只是提高查询排序的速度。

    转载于:https://www.cnblogs.com/eric-qin/p/4741405.html

    展开全文
  • 在数据库什么是主键与外键2008-03-05 15:03这需要理清几个概念: 1)候选键: 关系的一个属性组,其值能唯一标识一个元组,若从该属性组去掉任何一个属性,它就不具有这一性质了,这样的属性组称作候选码。...
  • 数据库自增主键

    2019-03-08 23:33:00
    UUID 的目的,是让分布式系统的所有元素,都能唯一的辨识资讯,而不需要透过中央控制端来做辨识资讯的指定。如此一来,每人都可以建立不与其它人冲突的 UUID。这样的情况下,就不需考虑数据库建立时的名称...
  • 数据库主键生成策略,你知道种? 系统唯一ID是我们设计一系统的时候常常会遇见的问题,也常常为这问题而纠结。生成ID的方法很多,适应不同的场景、需求以及性能要求。所以有些比较复杂的系统会ID...
  • 比如,你有一个员工的二维关系(表),大概这几个属性:员工表:系统内标识码,身份证号,工号,姓名,出生日期,所在部门,理论上讲,可以有三个码:Key1:系统内部标识,这个是数据库设计时,确定的唯一标...
  • 数据库中几个基本概念 主码 外码

    万次阅读 多人点赞 2015-07-17 10:20:22
    关系(表),主码不一定只有一,但是一定要的。因为元组,是对世界某种事物的数据描述,而世界各种事物,都具有唯一性,都是可以区分的。计算机为了描述事物的唯一性,引入了主码的概念。...
  • 例如:拥有万用户信息的表找到某个用户的信息,此时可以通过id来查找,因为id这属性是唯一的,通过这种唯一性来准确的实现,而实现这种方式的手段就是PRIMARY KEY(主键 ) 测试主键 CRE...
  • [一 逻辑模型的信息可以用三概念来描述:(1) 实体(如果一对象拥有许多特性和值,那么它可能是实体)(2) 属性(如果一对象拥有一特性的值,那么它可能是属性)主码 ,外码也可以称为主键,外键。什么是主码...
  • 作者:小小猿爱嘻嘻wukong.com/question/6749061190594330891/最常见的方式就是...下面我简单介绍一下,感兴趣的朋友可以尝试一下:这里为了方便演示,我新建了一user测试表,主要id,username,sex,address这...
  • 学完数据库,我们对SQL SERVER 2008的部分关键字了大概的了解,下面我来总结一下几个比较重要的关键字:字段、属性、列、记录(元组)、表、主键、外键。一、字段:某一个事物的一个特征,或者说是属性我们学...
  • 首先就是候选关键字,它指的是,给定关系,具有唯一标识特性的一或者多属性被...一表只能有一主关键字,主关键字又可以称为主键主键可以由一字段,也可以有字段组成,分别称为单字段主键和多字段主
  • 几个常用的命令:select database(); #查看当前所在的数据库。select user();...#可以查看建立的索引的表结构可能会遗漏的知识点:innodb存储引擎一个表必须个主键,当没有指定某一个字段为...
  • 实现一微型数据库

    2020-12-14 19:58:01
     大多数的时候我们不知道某一条记录几个位置,只知道主键的值。这时为了读取数据,可以一条条比对记录。但是这样做的效率太低。实际应用数据库往往采用B树格式存储数据。  二、关于B树  要理解B树先...
  • 2、第二范式:要求数据库的每实例或行必须可以被唯一的区分(主键),表的非主键字段完全依赖于主键字段 修改后: 3、第三范式:要求一个数据库不包含已其它表已包含的非主关键字信息 ...
  • 一些情况下,如要查询数据几个字段,此时可能产生重复记录,而重复的记录是不符合规范的,数据表是现实世界的客观反映,因此,空值的产生是不可避免。  1、查询时不显示重复记录  实现查询操作时,...
  • 数据库优化

    2020-10-24 15:50:51
    关于数据库优化分可以以下几个方面来讲 先说几个小的注意点 当表主键时,首先判断表是否非空的整形唯一索引,如果,则该列为主键,如果不符合上述条件,InnoDB存储引擎自动创建一个6byte自增主键,且_rowid...
  • mysql 数据表中主键(primary key)的操作

    万次阅读 2015-08-17 11:37:52
    4、每个表都应该个主键,并且每个表只能个主键创建主键时,我们可以在创建表的同时创建主键,当然有时出于疏忽,建好表后才发现没有创建主键,这时可以补上。 下面是MYSQL控制台
  • Navicat新建Mysql连接,创建连接这里不再多讲,csdn博主都介绍可以去搜,我这里创建数据库test---->新建表user---->创建 (主键)name、age 、sex这三个属性,并添加了几个数据如下图: 接着,IDEA...
  • 主键和外键

    2020-10-14 19:14:44
    关系型数据库中的每一个表都具备这样的特点, 同一个表中没有完全一致的两行数据, 当一行数据可以有少数几个属性确定的话,这几个属性就可以成为主键, 设立了表的主键之后,数据库系统会为主键的列建立索引和制约, ...
  • 数据库索引和分类

    2020-12-14 16:19:04
    聚集索引:在数据库中,所有行数都会按照主键索引排序。 非聚集索引:就是给普通字段加上索引。 联合索引:好几个字段组成的索引称为联合索引。 索引的底层是? 数据库索引的底层是B+树。 B+树的中间元素不储存数据...
  • MongoDB使用遇到的几个问题

    千次阅读 2016-10-26 18:20:04
    我一开始接触MongoDB的时候我觉得无论是什么数据库都是有主键的,而且可以自定义,直到遇到了MongoDB。没有人会喜欢被强制使用“_id”这样的主键名称,MongoBlog上面是这样说的: blog.mongodb.org:Every ...
  • 进行数据库设计的时候,经常会遇到主键如何设置的问题,数据库本来就提供了...当删除一个记录, 该值就不会再用,而Oracle,并没有提供这种类型,一般用使用Sequence来定义一个主键,当然,也可以用程序来控制他,而
  • 前言前面篇 blog,主要简单介绍了 MySQL 数据库中如何查看某张表,以及对表做一些增删改查的操作,本篇 blog 主要介绍一张表中如何设置唯一标识,以及两张表之间如何关联,即我们日常听说的主键和外键主键含义:...
  • 其实count函数除了*还可以放其他参数,比如常数、主键id、字段,那么它们什么区别?各自效率如何?我们应该使用哪种方式来获取表的行数呢?当搞清楚count函数的运行原理后,相信上面几个问题的答案就会了然于胸...
  • Spring Data Jpa 复合主键

    2019-04-15 12:02:25
    这次大创有个需求,在数据库建表时发现,主键为复合主键: 在网上看了篇博客,以及在spring boot干货群咨询(感谢夜升额耐心解答)过后总算是做出来了。这里做总结,方便日后查阅。 正文 这里采用@IdClass...
  • mysql数据库中有个主键生成规则,就是自增。本文就给大家从几个维度说明一下mysql自增主键。 二、主键设置原则 主键不可修改 对于数据库来说,主键其实是可以修改的,只要不和其他主键冲突就可以。但是,对于...
  • 数据库字段的约束

    2019-07-05 17:47:00
    数据库中的约束我归纳了一下有几种据我所知道的列举出来数据库中的字段的约束很有哟可以对输入的内容及逆行一规则 为了防止以后忘了所以现在列举出来给大家和我一参考 1)主键约束(primary key) 主键...

空空如也

空空如也

1 2 3 4 5 ... 10
收藏数 181
精华内容 72
关键字:

在数据库中可以有几个主键