精华内容
下载资源
问答
  • 数据库的三范式 数据库的三范式在本科阶段... 第二范式(2NF):唯一性,一个表只能说明一个事务,实体中的任意一个字段都只能依赖于表中的唯一主键; 第三范式(3NF):直接性,表中的每一个字段只能与主键直接...

    数据库的三范式

            数据库的三范式在本科阶段只是一个概念,在实际数据库的使用中,并没有将理论与实践结合起来,这次做的项目,用到数据库的三范式的知识点,复习并总结一些。

            用通俗的语言来简单介绍三范式的每个范式的特点:

          第一范式(1NF):原子性,实体中的每一个属性都不可再分;

          第二范式(2NF):唯一性,一个表只能说明一个事务,实体中的任意一个字段都只能依赖于表中的唯一主键;

          第三范式(3NF):直接性,表中的每一个字段只能与主键直接关联,不能间接关联。

    数据库的外键

              数据库的外键,外键表,主键表,级联一直混淆,只是名词没有实际的操作容易混乱,举例说明什么是外键,主键表,外键表。

         设有学生表student,院系表depart,其中院系表的院号departNum作为其主键,同时也是学生表的外键

        学生表将departNum做为自己的外键,则学生表是外键表,departNum是院系表的主键,所以称院系表是主键表

           外键的作用:保证数据的完整性和唯一性

       用上面的例子:

        在MYSQL中的级联删除:若是删除了主键表,会将从键表中的数据一并删除。

       比如:删除了院系表,则院系下的所有学生都会删除,反之,删除了学生表,院系表不受影响。

      换句话说:若是删除了院系表,而不删除学生表,在会造成数据的不完整性。

       

     

     

    展开全文
  • 关系型数据库的外键约束与关联

    千次阅读 热门讨论 2020-10-07 18:22:57
    举例说明:假设 Table user 的 Column user.id 为主键(Primary key),Table profile 的 Column profile.uid 为主键。以 user 为主表、profile 为关联表、profile.uid 为外键(Foreign key)将 user.id 作为参考...

    目录

    外键约束

    外键约束(Foreign key)是关系型数据库中的 Table 的一个特殊字段,经常与主键约束(Primary key)一起使用。对于两个具有关联关系的表而言,相关联字段中主键所在的表就是主表(父表),外键所在的表就是从表(子表)。外键约束可以保证引用的完整性(Referential Integrity)。

    引用完整性是数据的属性,如果数据拥有该属性,那么数据中所有的引用都是合法的,在关系型数据库的上下文中,这就意味着关系型数据库中引用另一个表中的值必须存在。

    简而言之,外键约束就是用来建立主表与从表的关联关系,为两个表的数据建立连接,约束两个表中数据的一致性和完整性。

    NOTE:一个 Table 可以有一个或多个外键,外键可以为空值,若不为空值,则每一个外键的值必须等于主表中主键的某个值。

    外键关联

    所谓外键关联,即:B 存在外键 b_f_k,以 A 表的 a_k 作为参照(References)列,则 A 为主表,B 为从表。

    • 若 A、B 关联了 on delete/update 等操作,则 A 中某记录的更新或删除会联动着 B 中外键与其关联对应的记录做更新或删除操作。

    • 反之,B 怎样变 A 不必跟随变动,且 A 中必须事先存在 B 要插入的数据外键列的值,例如:B.bfk 作为外键参照 A.ak,则 B.bfk 插入的值必须是 A.ak 中已存在的。简而言之,就是若 B 有以 A 作为参照的外键,则 B 中的此字段的取值只能是 A 中存在的值。

    外键的作用

    外键用于支持关系型数据库的 “参照完整性”,外键具有保持数据完整性和一致性的机制,对业务处理有着很好的校验作用。

    举例说明:假设 Table user 的 Column user.id 为主键(Primary key),Table profile 的 Column profile.uid 为主键。以 user 为主表、profile 为关联表、profile.uid 为外键(Foreign key)并将 user.id 作为参考(References),且联动了删除/更新操作(on delete/update cascade)。那么:

    • 在 user 中删除 id 为 1 的记录,会联动删除 profile 中 uid 为 1 的记录。
    • 在 user 中更新 id 为 1 的记录至 id 为 2,则 profile 中 uid 为 1 的记录也会被联动更新至 uid 为 2。

    这样即保持了数据的完整性,也保证了数据的一致性。而且这个工作都是交由 RDBMS 内部实现的触发器来完成的,不需要额外的编码。

    外键的性能问题

    外键的使用往往会带来性能问题,因为:

    1. 数据库需要维护外键的内部管理;
    2. 外键等于把数据的一致性事务实现,全部交给数据库服务器完成;
    3. 涉及外键字段的增,删,更新操作,需要触发相关操作去检查,而不得不消耗资源;
    4. 外键还会因为需要请求对其他表内部加锁而容易出现死锁情况。

    是否使用外键?

    因为外键具有性能问题,所以是否采用外键需要考虑业务应用场景,以及开发成本:

    1. 互联网行业应用不推荐使用外键:用户量大,并发度高。为此,数据库服务器很容易成为高并发访问的性能瓶颈,尤其受 I/O 能力限制,且不能轻易地水平扩展。此场景中,应该把数据一致性的实现放到业务逻辑中,让应用服务器来承担这部分的功能和压力,因为应用服务器可以轻松做到水平伸缩;

    2. 传统行业可以考虑使用外键:因为软件应用的人数是有限且可控的,数据库服务器的数据量也一般不会超大,且活跃数据有限。该场景中使用外键可以降低开发成本,借助 RDBMS 自身的触发器可以实现实体表与关联表之间的数据一致性和更新。另外,使用外键还可以做到开发人员和数据库设计人员(DBA)的分工,DBA 可以为程序员承担更多的工作量;

    使用外键的守则

    • 主表必须已经存在于数据库中,或者是当前正在创建的表。如果是后一种情况,则主表与从表是同一个表,这样的表称为自参照表,这种结构称为自参照完整性。
    • 必须为主表定义主键。
    • 外键中列的数目必须和主表的主键中列的数目相同。
    • 外键中列的数据类型必须和主表主键中对应列的数据类型相同。

    互联网应用应该尽量避免使用外键

    不使用外键的原因其实很简单,因为 MySQL、PostgreSQL 等关系型数据库很难水平扩容,但是无状态的服务往往都可以很容易地扩容。由于外键等特性需要数据库执行额外的工作,而这些操作会占用数据库的计算资源,所以我们可以将大部分的需求都迁移到无状态的服务中完成以降低数据库的工作负载,从而避免数据库成为高并发性能的瓶颈。

    另外,级联删除的出发点是为了保证数据的完整性,但是在设计关系表之间的不同关系时,我们也需要注意级联删除引起的数据大规模删除的问题。当客户端想要在数据库中删除 authos 表中的数据时,如果我们同时在 authors 和 posts 中指定了级联删除的行为,那么数据库会同时删除所有关联的 posts 记录以及与 posts 表关联的 comments 数据。

    这种涉及多级的级联删除行为在数据量较小的数据库中不会导致问题,但是在数据量较大的数据库中删除关键数据可能会引起雪崩,一条记录的删除可能会被放大到几十倍甚至上百倍,这些对磁盘的随机 I/O 会带来巨大的开销,是我们想要尽可能避免的情况。如果我们能够较好地设计各个表之间的关系并且慎用 CASCADE 行为,这对于保证数据库中数据的合法性有着很重要的意义,使用该特性可以避免数据库中出现过期的、不合法的数据,但是在使用时也要合理预估可能造成的最坏情况。

    在业务逻辑中模拟数据库外键

    想要在应用程序中模拟数据库外键的功能其实比较容易,我们只需要遵循以下的几个准则:

    1. 向表中插入数据或者修改表中的数据时,都应该执行额外的 SELECT 语句确保它引用的数据在数据库中存在;
    2. 在删除数据之前需要执行额外的 SELECT 语句检查是否存在当前记录的引用;

    需要注意的是为了保证一致性,我们需要在事务中执行上述的查询和修改语句,这样才能完整模拟外键的功能。例如:当我们向 posts 表中插入或者修改数据时,需要的处理相对比较简单,我们只需要执行有限的 SELECT 语句并按照如下所示的模式执行对应的操作就可以了:

    BEGIN
    SELECT * FROM authors WHERE id = <post.author_id> FOR UPDATE;
    -- INSERT INTO posts ... / UPDATE posts ...
    END
    

    但是如果我们要删除 authors 表中的数据,就需要查询所有引用 authors 数据的表;如果有 10 个表都有指向 authors 表的外键,我们就需要在 10 个表中查询是否存在对应的记录,这个过程相对比较麻烦,不过也是为了实现完整性的必要代价,不过这种模拟外键方法其实远比使用外键更消耗资源,它不仅需要查询关联数据,还要通过网络发送更多的数据包。

    手动实现数据库的级联删除操作也是可行的,如果我们在一个事务中按照顺序删除所有的数据,确实可以保证数据的一致性,但是这与外键的级联删除功能没有太大的区别,反而会有更差的表现。如果我们能够接受在一个时间窗口内的数据不一致,就可以将一个大号的删除任务拆成多个子任务分批执行,降低对数据库影响的峰值。

    DELETE FROM posts WHERE author_id = 1 LIMIT 100;
    DELETE FROM posts WHERE author_id = 1 LIMIT 100;
    ...
    DELETE FROM authors WHERE id = 1;
    

    注意,与数据库外键的 CASCADE 相比,这种方式会带来更大的额外开销,只是我们能降低对数据库性能的瞬时影响。

    on delete/update 的外键关联操作类型

    下文以 MySQL 为例。

    • no action(不采取行动)
    • cascade(级联)
    • set null(设为空)
    • restrict(禁止)

    示例:

    # 主表
    create table country
    (
    	id int not null,
    	name varchar(30),
    	primary key(id)
    ) ENGINE=InnoDB DEFAULT CHARSET=gb2312;
    

    CASCADE(级联)约束方式

    CASCADE(级联),表示主表在进行更新和删除时,更新和删除从表相对应的记录。

    # 从表
    create table solider
    (
    	id int not null,
    	name varchar(30),
    	country_id int,
    	primary key(id),
    	foreign key(country_id) references country(id) on delete cascade on update cascade
    ) ENGINE=InnoDB DEFAULT CHARSET=gb2312;
    
    • 参照完整性测试:
    # 插入主表记录
    insert into country values(1, '西欧');
    insert into country values(2, '玛雅');
    insert into country values(3, '西西里');
    
    # 插入从表记录
    insert into solider values(1, '西欧见习步兵', 1);      # 插入成功
    insert into solider values(2, '玛雅短矛兵', 2);       # 插入成功
    insert into solider values(3, '西西里诺曼骑士', 3);   # 插入成功
    insert into solider values(4, '法兰西剑士', 4);      # 插入失败,因为主表中不存在 id 为 4 的记录
    
    • 约束方式测试:
    insert into solider values(4, '玛雅猛虎勇士', 2); # 成功插入
    delete from country where id=2;                 # 会导致从表中 id 为 2 和 4 的记录同时被删除
    update country set id=8 where id=1;             # 会导致solider表中country_id为1的所有记录同时也会被修改为8
    

    SET NULL(设空)约束方式

    SET NULL(设空),表示主表进行更新和删除的时候,从表的对应字段被设为 NULL。

    create table solider
    (
    	id int not null,
    	name varchar(30),
    	country_id int,
    	primary key(id),
    	foreign key(country_id) references country(id) on delete set null on update set null
    ) ENGINE=InnoDB DEFAULT CHARSET=gb2312;
    
    • 参照完整性测试:
    # 插入主表记录
    insert into country values(1, '西欧');
    insert into country values(2, '玛雅');
    insert into country values(3, '西西里');
    
    # 插入从表记录
    insert into solider values(1, '西欧见习步兵', 1);    # 插入成功
    insert into solider values(2, '玛雅短矛兵', 2);     # 插入成功
    insert into solider values(3, '西西里诺曼骑士', 3); # 插入成功
    insert into solider values(4, '法兰西剑士',4);     # 插入失败,因为主表中不存在 id 为 4 的记录
    
    • 约束方式测试
    insert into solider values(4, '西西里弓箭手', 3);  # 成功插入
    delete from country where id=3;                 # 会导致从表中 id 为 3 和 4 的记录被设为 NULL
    update country set id=8 where id=1;             # 导致从表中 country_id 为 1 的所有记录被设为 NULL
    

    以 NO ACTION(不采取行动)或 RESTRICT(禁止)方式

    NO ACTION(不采取行动)或 RESTRICT(禁止),限制在从表有关联记录的情况下,主表不能单独进行删除和更新操作。保持数据的强一致性。

    注:在 MySQL 中,no action 与 restrict 的功能相同。而在其他数据库中,no action 可能为不进行任何操作。

    create table solider
    (
    	id int not null,
    	name varchar(30),
    	country_id int,
    	primary key(id),
    	foreign key(country_id) references country(id) on delete RESTRICT on update RESTRICT
    ) ENGINE=InnoDB DEFAULT CHARSET=gb2312;
    
    # or
    create table solider
    (
    	id int not null,
    	name varchar(30),
    	country_id int,
    	primary key(id),
    	foreign key(country_id) references country(id) on delete no action on update no action
    ) ENGINE=InnoDB DEFAULT CHARSET=gb2312;
    
    • 参照完整性测试:
    # 插入主表记录
    insert into country values(1, '西欧');
    insert into country values(2, '玛雅');
    insert into country values(3, '西西里');
    
    # 插入从表记录
    insert into solider values(1, '西欧见习步兵', 1);    # 插入成功
    insert into solider values(2, '玛雅短矛兵', 2);     # 插入成功
    insert into solider values(3, '西西里诺曼骑士', 3); # 插入成功
    insert into solider values(4, '法兰西剑士',4);     # 插入失败,因为主表中不存在 id 为 4 的记录
    
    • 约束方式测试
    insert into solider values(4, '西欧骑士', 1);  # 成功插入
    delete from country where id=1;               # 发生错误,从表中有关联记录,因此主表中不可删除相对应记录
    update country set id=8 where id=1;           # 错误,从表中有相关记录,因此主表中无法修改。
    
    展开全文
  • (2)将 ER 图转换成关系模型,并说明主键和外键。 (二) 设某汽车运输公司数据库中有三个实体集。一是“车队”实体集,属性有车队号、车 队名等;二是“车辆”实体集,属性有车牌照号、厂家、出厂日期等;三是“司机...
  • 对于数据库来说,主键其实是可以修改的,只要不其他主键冲突就可以。但是,对于应用来说,如果一条记录要修改主键,那就会出大问题。因为主键的第二个作用是让其他表的外键引用自己,从而实现关系结构。一旦某个...

    一、前言

        我们常用mysql,在设计表结构的时候必须考虑主键的事情。mysql数据库中有一个主键生成规则,就是自增。本文就给大家从几个维度说明一下mysql自增主键。

    二、主键设置原则

    1. 主键不可修改

        对于数据库来说,主键其实是可以修改的,只要不和其他主键冲突就可以。但是,对于应用来说,如果一条记录要修改主键,那就会出大问题。因为主键的第二个作用是让其他表的外键引用自己,从而实现关系结构。一旦某个表的主键发生了变化,就会导致所有引用了该表的数据必须全部修改外键。很多Web应用的数据库并不是强约束(仅仅引用主键但并没有设置外键约束),修改主键会导致数据完整性直接被破坏。

         2. 业务字段不可用于主键

         所有涉及到业务的字段,无论它看上去是否唯一,都决不能用作主键。例如,用户表的Email字段是唯一的,但是,如果用它作主键,就会导致其他表到处引用Email字段,从而泄露用户信息。类似的,看上去唯一的用户名、身份证号等,也不能用作主键。对这些唯一字段,应该加上unique索引约束。此外,修改Email实际上是一个业务操作,这个操作就直接违反了上一条原则。那么,主键应该使用哪个字段呢?主键必须使用单独的,完全没有业务含义的字段,也就是主键本身除了唯一标识和不可修改这两个责任外,主键没有任何业务含义。

    三、MySQL使用自增主键优缺点

          1、优点

         mysql使用什么字段做主键,是重点考虑两方面:业务场景和效率问题。在满足业务场景的前提下,使用自增序列做主键是最优选择。原因如下:
    1.自增主键节省存储空间。
    2.innodb的索引特性导致了自增id做主键是效率最好的
    与UUID主键对比:
      在500W记录表的测试下:
    (1) 普通单条或者20条左右的记录检索,uuid为主键的相差不大几乎效率相同;
    (2) 但是范围查询特别是上百成千条的记录查询,自增id的效率要大于uuid;
    (3) 在范围查询做统计汇总的时候,自增id的效率要大于uuid;
    (4) 在存储上面,自增id所占的存储空间是uuid的1/2;
    (5) 在备份恢复上,自增ID主键稍微优于UUID。
        在1000W记录表的测试下:
    (1)普通单条或者20条左右的记录检索,自增主键效率是uuid主键的2到3倍;
    (2)但是范围查询特别是上百成千条的记录查询,自增id的效率要大于uuid;
    (3)在范围查询做统计汇总的时候,自增id主键的效率是uuid主键1.5到2倍;
    (4)在存储上面,自增id所占的存储空间是uuid的1/2;
    (5)在写入上面,自增ID主键的效率是UUID主键的3到10倍,相差比较明显,特别是update小范围之内的数据上面。
    (6)在备份恢复上,自增ID主键稍微优于UUID。
         对于InnoDB这种聚集主键类型的引擎来说,数据会按照主键进行排序,由于UUID的无序性,InnoDB会产生巨大的IO压力,而且由于索引和数据存储在一起,字符串做主键会造成存储空间增大一倍。
    在存储和检索的时候,innodb会对主键进行物理排序,这对auto_increment_int是个好消息,因为后一次插入的主键位置总是在最后。但是对uuid来说,这却是个坏消息,因为uuid是杂乱无章的,每次插入的主键位置是不确定的,可能在开头,也可能在中间,在进行主键物理排序的时候,势必会造成大量的 IO操作影响效率,在数据量不停增长的时候,特别是数据量上了千万记录的时候,读写性能下降的非常厉害。
    总结:
    (1)单实例或者单节点组:
          经过500W、1000W的单机表测试,自增ID相对UUID来说,自增ID主键性能高于UUID,磁盘存储费用比UUID节省一半的钱。所以在单实例上或者单节点组上,使用自增ID作为首选主键。
    (2)分布式架构场景:
    20个节点组下的小型规模的分布式场景,为了快速实现部署,可以采用多花存储费用、牺牲部分性能而使用UUID主键快速部署;
    20到200个节点组的中等规模的分布式场景,可以采用自增ID+步长的较快速方案。
    200以上节点组的大数据下的分布式场景,可以借鉴类似twitter雪花算法构造的全局自增ID作为主键

         2、缺点

    引用《高性能MySQL》中的原话

    四、MySQL innodb存储引擎建议使用自增主键剖析

         问:为什么建表的时候建议创建自增ID,直接用唯一业务的标识ID不香吗?

         答:是的,不香。

         InnerDB使用的B+树模型,B+树的结构决定了 所有左节点< 节点< 右节点,这样带来的好处我就不详细说了,坏处就是当新增主键破坏了现有树形结构的时候,就需要将大于这个值得主键向后挪用。当需要挪动的数据页已经处于存满的状态,就会更加的麻烦。但是当我们使用主键递增ID的时候,所有新增的主键都为当前主键的最大值,所以只需要在索引树的最右边加上一个记录即可。这也就是为什么要采用自增ID的原因。举一个的例子:

    当你想加一条数据(ID=700)的时候,只需要在700节点的右边新增一条新记录即可。但是你新增的记录为(ID=400)的时候,你就需要把ID=500和ID=600的数据往后挪,然后把ID=400的记录加进去。

    五、MySQL的自增ID用完了怎么办

           在 MySQL 中用很多类型的自增 ID,每个自增 ID 都设置了初始值。一般情况下初始值都是从 0 开始,然后按照一定的步长增加。在 MySQL 中只要定义了这个数的字节长度,那么就会有上限。

          数据表定义的自增 ID,如果达到上限之后。再申请下一个 ID 的时候,获得到的值将保持不变。我们可以通过下面这个例子来验证一下: 

    create table `test` (
       `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
       PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=4294967295;
     
    insert into `test` values (null);

    Tips:如果预计到 ID 值可能会被用完,则应该考虑选择 bigint unsigned 类型。

    总结:数据库表的自增 ID 达到上限之后,再申请时它的值就不会在改变了,继续插入数据时会导致报主键冲突错误。因此在设计数据表时,尽量根据业务需求来选择合适的字段类型。

    六、参考文章

    1、https://www.cnblogs.com/yxhblogs/p/12041905.html

    2、https://www.cnblogs.com/520playboy/p/10083393.html

    3、https://www.pianshen.com/article/3127956689/

    4、https://www.kancloud.cn/db-design/mysql-dba/596722

    展开全文
  • SQL Server学习记忆——数据库设计的技巧举例(二)1前言这篇博文中对数据库的关系模型,主键和外键,如何避免冗余进行了讲解,并用示例说明了数据库表的组成。

    SQL Server学习记忆——数据库设计的技巧并举例(二)1

    前言

    这篇博文中对数据库的关系模型,主键和外键,如何避免冗余进行了讲解,并用示例说明了数据库表的组成。

    关系模型

    连个公共表之间联系有三种:一对一,一对多和多对多。
    1. 一对一
    表A中的每一行最多和表B有一个相匹配的行。
    2. 一对多
    表A中的每一行和表B有0~n个相匹配的行,但不可逆。如:出版社可以出版多本书,但一本书只能被一个出版社出版。
    3. 多对多
    表A中的每一行和表B有0~n个相匹配的行,表B中的每一行和表A有0~n个相匹配的行。

    主键与外键

    主键与外键一般而言,一个实体不能既无主键又无外键。主键与外键的设计,在全局数据库的设计中,占有重要地位。当全局数据库的设计完成以后,有个美国数据库设计专家说:“键,到处都是键,除了键之外,什么也没有”,这就是他的数据库设计经验之谈,也反映了他对信息系统核心(数据模型)的高度抽象思想。因为:主键是实体的高度抽象,主键与外键的配对,表示实体之间的连接。

    规范化

    规范化是通过修改表以减少冗余和矛盾的一系列步骤。
    1. 第一范式(1NF)
    (1)列仅包含原子值(原子值,是不能再细分的单一值);
    (2)没有重复的组(两个或多个逻辑相关联的列的集合。

    title_id title_name authors
    T01 1977! A01
    T02 But I Did It… A03,A04
    T03 Perhaps… A03,A04,A05

    这个表的列authors给出了多个作者,因此违反了1NF。

    title_id title_name author1 author2 author3
    T01 1977! A01
    T02 But I Did It… A03 A04
    T03 Perhaps… A03 A04 A05

    这个表违反了1NF的第2条规则。

    1. 第二范式(2NF)
      (1)主键是一个列(关键字不是组合);
      (2)表中所有的列是主键的一部分;
      (3)满足第一范式;
      (4)非部分函数依赖。

    2. 第三范式(3NF)
      (1)满足2NF;
      (2)没有传递依赖。

    每一种范式都比前一种更稳健,符合3NF的数据库也符合2NF和1NF。规范化水平越高,表的数量就越多。

    示例数据库

    使用名为books的数据库,该数据库包含表有:authors,publishers,titles和titles_authors。
    1. 表authors
    authors描述书的作者,每一个作者有唯一的标识符,称为主键。表authors的结构如下:

    列名 描述 数据类型 空? 主键
    au_id 作者唯一标识符 CHAR(3) 主键
    au_fname VARCHAR(15)
    au_lname VARCHAR(15)
    phone 电话号码 VARCHAR(12)

    2. 表authors的内容如下:

    au_id au_fname au_lname phone
    A01 zw s 15210679868
    A02 yj x 15210679867
    A03 zx z 15210679866
    A04 cy z 15210679865

    3. 表publishers

    pub_id pub_name city country
    P01 Earth Shang Hai China
    P02 Sky Bei Jing China
    P03 Water Da Lian China

    4.表 titles

    title_id title_name pub_id pubdate
    T01 1977! P01 2000-08-01
    T02 2000 Years of… P03 2009-09-21
    T03 Water World P02 1987-05-12

    4. 表title_authors

    title_id authors_id
    T01 A01
    T02 A03
    T03 A02

    正确认识数据冗余

    主键与外键在多表中的重复出现, 不属于数据冗余。非键字段的重复出现,才是数据冗余!而且是一种低级冗余,即重复性的冗余。高级冗余不是字段的重复出现,而是字段的派生出现。

      〖例4〗:商品中的“单价、数量、金额”三个字段,“金额”就是由“单价”乘以“数量”派生出来的,它就是冗余,而且是一种高级冗余。冗余的目的是为了提高处理速度。只有低级冗余才会增加数据的不一致性,因为同一数据,可能从不同时间、地点、角色上多次录入。因此,我们提倡高级冗余(派生性冗余),反对低级冗余(重复性冗余)。



    1. [1] SQL基础教程(第三版).
    展开全文
  • 2020-12-06

    2020-12-06 21:58:48
    1.海底捞排号单、预打单如下所示。请根据排号单和预打单显示的信息和自己日常就餐的经验,进行...2)将E-R模型转换成关系模型,并指出每个关系的主键和外键。 3)判断(2)中的每个关系是否达到3NF,并说明理由。 ...
  • 因为不是主外键而且没有约束 导致我现在联查第一张表信息的 性别标识启用标识 查出来的数据都混乱的 ![图片说明](https://img-ask.csdn.net/upload/202007/14/1594720749_488170.png) ![图片说明]...
  • Hibernate的一对一关联关系,分为基于外键的一对一关联关系基于主键的一对一关联关系。在这篇文章中,我们以部门部门经理的例子来说明,一个部门对应唯一一个部门经理,一个部门经理也对应唯一一个部门。  在...
  • 【PostgreSQL-9.6.3】约束

    2017-05-23 23:18:53
    PostgreSQL中的约束有以下五种:主键约束、外键约束、非空约束、唯一性约束、默认约束。下面分别对这五种约束作说明。 一、主键约束(PrimaryKey Constraint) ...主键分为两种类型:单字段主键和
  • 关于belongsTobelongsToMany的用法官方手册上没有做详细的说明,如果只单纯的按照文档上的参数去套肯定会碰到跟我一样的问题。 下面看手册上的参数说明 belongsTo('关联模型名','外键名','关联表主键名',['...
  • 说明主键、惟一键和外键的作用。说明它们在保证数据完整性中的应用方法。 1.主键是唯一识别一个表的每一记录,作用是将记录和存放在其他表中的数据进行关联, 与外键构成参照完整性约束。 2.惟一键用于指明...
  • 3NF,在 SQL Server 2008 上创建数据库,定义各个表的主键和 外键,自行定义一些索引,自行录入部分合理数据,创建一个 登录名和数据库账号,赋予相应的数据库操作权限。 2) 良好标准:满足及格标准,在此基础上...
  • (1)新建报酬表,要求指定关系的主键和外键,以及工资大于零的约束。(说明:职工号char (7), 工程号char (6),工资numeric(20,2)) (2) 查询年龄在30岁到40岁的男职工姓名和工资 (3)查询总收入超过5万的职工信息,信息...
  • 支持事务,主要是面向在线事务处理方面的应用,特点是行锁设计,支持外键。InnoDB采用聚集索引的方式。没有主键,没有唯一键,为每一行生产一个6字节的行id作为主键。 3、MOMERY 将数据放在内存中,如果数据库
  • Hibernate注解关系映射

    2017-02-17 10:50:00
    Hibernate Annotation关系映射的几种类型映射用法及使用方法(说明:以前实例的实体是userrole,主键分别是useridroleid) 1)一对一外键关联映射(单向) @OneToOne(cascade=CascadeType.ALL) //一对一外键...
  • Hibernate Annotation关系映射的几种类型映射用法及使用方法(说明:以前实例的实体是userrole,主键分别是useridroleid) 1)一对一外键关联映射(单向) @OneToOne(cascade=CascadeType.ALL) //一...
  • 数据库简答题

    2020-09-02 10:29:30
    并说出它们的作用3、说出charvarchar的区别,及它们的适用场景4、说出不小于3种mysql数据库支持的约束,并说明它们的使用场景5、说出5种SQL中常用的聚合函数,并说明它们的作用6、说出SQL中内连接、左连接、右连接...
  • 含义说明:不同的老师由于水平教龄的不同; 类型:字符型; 长度:8位; 取值范围:{a,b,c,d,e}; 取值含义:分别代表本中级、高级、副教授、教授等等; B 数据项:学号; 含义说明:唯一标识每个学生; 别名:...
  • 11_完成CRUD实验回顾补充细节知识(上) 12_完成CRUD实验回顾补充细节知识(下) 13_总结分析第一天的讲解内容 14_多对一关联关系的映射与原理分析 15_多对一关联关系的检索与原理分析 16_保存多对一...
  • 数据库资料

    2018-04-01 22:00:33
    主要包含最基础的数据库语句,很适合初学者,目标使用企业管理器创建数据库表设置表的主键外键和建立表之间的关系为表增加约束数据完整性 数据完整性 数据存放在表中 “数据完整性的问题大多是由于设计引起的” ...
  • 主要字段说明: id(主键),creator,createTime,version(最新版本号),content_id(最新版本对应的内容id) 表二:script_content(维护版本脚本内容) 主要字段:id(主键),script_id(外键,表示属于哪个...
  • java+mysql代码

    2018-05-13 18:56:55
    3.添加student表、course表、score表的主外键约束以及course表teacher表的主外键关联。 4.查询学过“方芳”老师所教课程的学生的学号、姓名。(假定学生所学的课程均参加了考试)。 5.查询所有课程成绩均小于60...
  • 表的操作功能强大,可以通过界面创建一个表,很方便的创建索引,主键,外键.重新命名表名列名.删除表列.删除 <br/>表中数据,释放表空间,显示表的授权情况,显示表的创建,索引,授权等语句,可以把文本文件,dbf文件,...
  • 通过通俗易懂的语言讲解SQL Server 2008的各个强大功能,配以插图讲解详细的步骤说明,帮助读者快速掌握实用技能。  由浅入深,难易穿插。《SQL Server 2008宝典》面向入门级提高级两类读者,每个知识点都...

空空如也

空空如也

1 2 3
收藏数 60
精华内容 24
关键字:

并说明主键和外键