第一部分 主键映射 前言:区分主键的两种方法。 ? ? 但不管是什么主键,它都必须满足以下几个条件: 主键不能为空。 主键不能重复。 主键不能被修改。...8.3 复合主键的映射 复合主键的映射有两种方法:单独定义主键类和不单独定义主键类,下面分别介绍: 8.3.1 单独定义主键类 单独定义主键类,即把主键的属性组成一个新的类,这个类与要映射的POJO类类似...,也要生成它的get和set方法,但是该类并不作为POJO类使用,而是作为映射POJO类的一个主键属性。...在完全没有操作数据库的情况下,程序就完成了对数据的插入。插入数据后,login表和detail表的内容如图8.4和图8.5所示。 ? 唯一外键方式:唯一外键的情况很多,例如,每个人对应一个房间。...对应的Person表和Room表如表8.11和表8.12所示。 ? 【实例8.4】唯一外键方式示例。
reset():回退到所有迁移之前的初始状态(初始化) refresh():回退到初始状态,再执行所有迁移文件(重启(back->migrating) fresh():删除数据表,再次执行所有迁移文件...change() 重命名字段 $table->renameColumn('from','to') 删除字段 dropCloumn('字段名') dropCloumn(['字段名','字段2']) 外键约束...当前表从表字段')->references('参考表主表字段')->on('主表') ->onDelete('cascade')//级联删除 ->update('cascade')//级联更新 默认的外键名...数据表名称_外键字段_foreign 删除外键 dropForeign('外键名') 开启/关闭外键约束 Schema::enableForeignKeyConstraints() Schema...primary(['id','cid'])// 复合主键 $table->unique('email') //创建唯一索引 $table->index('name') //普通索引 $tale->spatialIndex
int Name string } 1.3 重写引用(一般不用) 对于 belongs to 关系,GORM 通常使用数据库表,主表(拥有者)的主键值作为外键参考。...正如上面的例子,我们使用主表Company中的主键字段ID作为外键的参考值。...} type CreditCard struct { gorm.Model Number string UserRefer uint } 3.3 重写引用 GORM 通常使用拥有者的主键作为外键的值...您可以通过 SetupJoinTable 指定它,例如: 注意: 自定义连接表要求外键是复合主键或复合唯一索引 type Person struct { ID int Name...,查看 Delete with Select 获取详情 4.9 复合外键 如果您的模型使用了 复合主键,GORM 会默认启用复合外键。
TABLE questions ( -- 问题ID,自增主键 question_id INT AUTO_INCREMENT PRIMARY KEY, -- 所属调查ID,外键关联...非主键列必须完全依赖于主键,而不能只依赖于主键的一部分(针对复合主键而言)。 解释: 第二范式建立在第一范式的基础上,主要关注于主键与非主键列之间的依赖关系。...如果表中的某一列只与复合主键的一部分有关,那么它就不应该存在于这个表中,而应该被分离出去形成另外一张新表。 第三范式(3NF, Third Normal Form) 定义: 满足2NF。...非主键列必须直接依赖于主键,不能存在传递依赖。即非主键列必须直接依赖于整个主键,而不能依赖于主键的一部分。 解释: 第三范式是在第二范式的基础上进一步细化的。...它主要关注于消除传递依赖,即非主键列不应该依赖于主键的某一部分,而应该直接依赖于整个主键。 如果存在传递依赖,那么应该考虑将这个非主键列分离出去,形成新的表,并通过主键或外键与原表进行关联。
除MySQL强制实施的规则外,还应该坚持的最佳实践: 不更新主键列中的值 不重用主键列的值 不在主键列中使用可能会更改的值 例如,如果使用一个名字作为主键以标识某个供应商,当该供应商合并和更改其 名字时...联合主键体现在多个表上,复合主键体现在一个表中的多个字段。 复合主键 主键通常定义在表的一列上,但这并不是必需的,也可使用多个列作为主键。...表的主键含有一个以上的字段组成,不使用无业务含义的自增id作为主键 将多个字段设置为主键,形成复合主键,这多个字段联合标识唯一性,其中,某几个主键字段值出现重复是没有问题的,只要不是有多条记录的所有主键值完全一样...一个属性可以为作为一个超键,多个属性组合在一起也可以作为一个超键。超键包含候选键和主键。 候选键 是最小超键,即没有冗余元素的超键。...外键 在一个表中存在的另一个表的主键称此表的外键 主键的选择 代理主键(推荐使用) 与业务无关的,无意义的数字序列。
在 Django 中,外键(ForeignKey)通常只引用另一张表的一个字段,比如一个主键或一个唯一标识字段。然而,如果我们需要让一个外键引用另一张表中的多个字段,通常有以下几种方法来实现这种关系。...1、问题背景在 Django 中,模型之间的关系通常使用外键(ForeignKey)来建立。外键允许一个模型中的字段引用另一个模型中的主键。然而,有时我们需要在一个模型中引用另一个模型中的多个字段。...2、解决方案为了在 sales_process 表中引用 product_models 表中的多个字段,我们可以使用复合主键(Composite Key)的方式。复合主键是指由多个字段组成的主键。...以下是如何在 Django 中使用复合主键来实现外键引用另一个表中的多个字段:在 product_models 模型中,添加一个 id 字段作为主键:class product_models(models.Model...划重点Django 不直接支持复合外键,但可以通过添加唯一约束、使用中间表或在查询中使用逻辑约束来实现类似效果。
所以我们在创建表的时候一定要按照一定的顺序来创建,否则就会出现没有外键关系导致的创建异常。...非主键列必须完全依赖于主键,而不能只依赖于主键的一部分(针对复合主键而言)。 解释: 第二范式建立在第一范式的基础上,主要关注于主键与非主键列之间的依赖关系。...如果表中的某一列只与复合主键的一部分有关,那么它就不应该存在于这个表中,而应该被分离出去形成另外一张新表。 第三范式(3NF, Third Normal Form) 定义: 满足2NF。...非主键列必须直接依赖于主键,不能存在传递依赖。即非主键列必须直接依赖于整个主键,而不能依赖于主键的一部分。 解释: 第三范式是在第二范式的基础上进一步细化的。...它主要关注于消除传递依赖,即非主键列不应该依赖于主键的某一部分,而应该直接依赖于整个主键。 如果存在传递依赖,那么应该考虑将这个非主键列分离出去,形成新的表,并通过主键或外键与原表进行关联。
联合主键体现在多个表上,复合主键体现在一个表中的多个字段。 复合主键 主键通常定义在表的一列上,但这并不是必需的,也可使用多个列作为主键。...表的主键含有一个以上的字段组成,不使用无业务含义的自增id作为主键 将多个字段设置为主键,形成复合主键,这多个字段联合标识唯一性,其中,某几个主键字段值出现重复是没有问题的,只要不是有多条记录的所有主键值完全一样...一个属性可以为作为一个超键,多个属性组合在一起也可以作为一个超键。超键包含候选键和主键。 候选键 是最小超键,即没有冗余元素的超键。...外键 在一个表中存在的另一个表的主键称此表的外键 主键的选择 数据库中的每一条记录都需要有一个唯一的标识,依据数据库第二范式,数据库中每一个表中都需要有一个唯一的主键,其他数据元素和主键一一对应。...而对于用户表来说,我们需要考虑的是作为主键的业务字段是否能够唯一标识一个人,一个人可以有多个email和手机号,一旦出现变更email或者手机号的情况,就需要变更所有引用的外键信息,所以使用email或者手机作为主键是不合适的
在解开谜底之前,先给大家说明几个简单的概念。数据库的主键、外键和数据库索引。 数据库主键:指的是一个列或多列的组合,其值能唯一地标识表中的每一行,通过它可以强制表的实体完整性。...主键主要是用与其他表的外键关联,以及本记录的修改与删除。除了能够保证实体的完整性,主键还能加速数据库的操作速度。 数据库外键:外键是用于建立和加强两个表数据之间链接的一列或多列。...通过将保存表中主键值的一列或多列添加到另一个表中,可创建两个表之间的链接。这个列就成为第二个表的外键。...当你想和其他房间的人建立关联关系时,会找一个双方都认可的人,作为联系人,这个人就是外键。...到这里我们就为大家讲完了利用数据库主键提升访问性能的第一部分,在第二部分中我们会继续为大家介绍如何在大规模数据量的场景下提升数据访问效率。
此外,GORM 还提供了一些迁移接口的方法,可以帮助我们方便操作数据库表、字段和索引。 02 自动迁移 AutoMigrate 用于自动迁移您的 schema,保持您的 schema 是最新的。...AutoMigrate 会创建表,缺少的外键,约束,列和索引,并且会更改现有列的类型(如果其大小、精度、是否为空可更改)。但不会删除未使用的列,以保护您的数据。...// 创建表时添加后缀 db.Set("gorm:table_options", "ENGINE=InnoDB").AutoMigrate(&User{}) AutoMigrate 会自动创建数据库外键约束...nil { fmt.Printf("创建数据库表失败,错误:%s\n", err) return } fmt.Println("创建数据库表成功") 默认情况下,GORM 会约定使用 ID 作为表的主键...通过将多个字段设为主键,以达到创建复合主键,整型字段设为主键,默认为启用 AutoIncrement,如果需要禁用,使用标签autoIncrement:false。
key; 在创建表的时候,在所有字段之后,使用primary key( 主键字段列表)来创建主键,如果有多个字段作为主键, 可以使用复合主键 。...假如指定表中两列为复合主键,只要两列中有一列的数据不同于其他列数据就可以正常插入。...一张表中有往往有很多字段需要唯一性,数据不能重复,但是一张表中只能有一个主键:唯一键就可以解决表中有多个字段需要唯一性约束的问题。...六、外键 外键用于定义主表和从表之间的关系: 外键约束主要定义在从表上,主表则必须是有主键约束或unique约束。当定义外键后,要求外键列数据必须在主表的主键列存在或为null 。...如果两张表在业务上是有相关性的,但是在业务上没有建立约束关系,那么就可能出现问题。解决方案就是通过外键完成的。
所以我们在创建表的时候一定要按照一定的顺序来创建,否则就会出现没有外键关系导致的创建异常。...每张表都有相应的主键和外键约束,以确保数据的完整性和准确性。这些表之间通过外键相互关联,形成了学生信息管理系统的基本数据结构。...非主键列必须完全依赖于主键,而不能只依赖于主键的一部分(针对复合主键而言)。 解释: 第二范式建立在第一范式的基础上,主要关注于主键与非主键列之间的依赖关系。...如果表中的某一列只与复合主键的一部分有关,那么它就不应该存在于这个表中,而应该被分离出去形成另外一张新表。 第三范式(3NF, Third Normal Form) 定义: 满足2NF。...它主要关注于消除传递依赖,即非主键列不应该依赖于主键的某一部分,而应该直接依赖于整个主键。 如果存在传递依赖,那么应该考虑将这个非主键列分离出去,形成新的表,并通过主键或外键与原表进行关联。
TiKV 负责存储数据,随着数据量的增长,可以部署更多的 TiKV Server 节点解决数据容量的问题。PD 会在 TiKV 节点之间以 Region 为单位做调度,将部分数据迁移到新加的节点上。...;唯一索引没有此限制 Drop Column 操作不支持删除主键列 TiDB 不支持外键,要去掉所有表结构中创建外键的相关语句。...外键的级联操作多表数据的功能需要在应用中完成。 2.4 索引 和表中的数据一样,TiDB 中表的索引在存储引擎中也被作为 KV 来存储,一行索引是一个 KV 对。...例如一张有 2 个索引的表,每插入一行数据的时候,会写入 3 个 KV 对。 TiDB 支持主键索引、唯一索引,也支持二级索引,构成以上索引的可以是单一列,也可以是多个列(复合索引)。...2.6 暂不支持的特性 TiDB 在大部分情况下能保证与 MySQL 的兼容,不过一些特性由于在分布式环境下没法很好的实现,目前暂时不支持,比如: 存储过程 视图 触发器 自定义函数 外键约束 全文索引
(不是MySQL的限制,是经验值) 处理方式:历史数据归档、分库分表 谨慎使用MySQL分区表 分区表:在物理上表现为多个文件,在逻辑上表现为一个表 问题:谨慎选择分区键,跨分区查询效率可能更低 建议:...索引设计规范 限制每张表的索引数量,建议单表索引不超过5个 索引增加查询效率,但是降低插入和更新效率 禁止给每一列都建立单独的索引 每个Innodb表必须有一个主键 不使用更新频繁的列作为主键,不使用多列主键...,因为更新后就涉及对索引顺序的修改,频繁更新会导致频繁调整,导致降低性能 不使用UUID,md5,hash字符串作为主键,因为这类哈希不保证插入时递增的特性 建议:使用自增ID值 在哪建立索引?...覆盖索引:包含了所有查询字段的索引 避免Innodb表进行索引的二次查找 可以把随机IO变为顺序IO加快查询效率 尽量避免使用外键 外键是用于保证数据的参照完整性,但建议在业务端实现。...MySQL外键会建立索引 不建议使用外键约束 表与表之间的关联键建立索引是必须的 外键会影响父表和子表的写操作而降低性能(检查约束导致的) 字段设计规范 优先选择符合存储需要的最小的数据类型 将字符串转化为数字类型存储
,也会自动生成 id ,作为数据行的主键 一个表中只能有一个主键,但一个主键可以包含多个列,称为复合主键 2.4.3 直接指定一个主键值的情况: 新增一个主键为8的数据也成功执行了,并且后面再新增一个null...: 一个表中只能有一个主键,但一个主键可以包含多个列,称为复合主键 这样直接定义两个主键会报错 复合主键的定义方法: -- 复合主键的定义 create table pre_text ( id...,只有复合主键中所有的列相同才能够被判定相同,例如下面的唯一判断是没有问题的 下面这个只有一个id列相同,name列不同,所以可以直接插入 2.5 外键约束 2.5.1 插入 外键约束语法: 外键约束用来将两张表的数据之间建立连接...,从而保证数据的一致性和完整性 此时创建的两张表没有任何的主外键关系,所以说插入一条不存在的班级编号在学生表里也是可以添加成功的 这时设置class表的id 为主键,student表的 class_id...为id的外键 create table class ( id bigint primary key auto_increment, name varchar(20) ); create
数据表: 表是数据的矩阵。在一个数据库中的表看起来像一个简单的电子表格。 列: 一列(数据元素) 包含了相同的数据, 例如邮政编码的数据。...**行:**一行(=元组,或记录)是一组相关的数据,例如一条用户订阅的数据。 冗余:存储两倍数据,冗余降低了性能,但提高了数据的安全性。 主键:主键是唯一的。一个数据表中只能包含一个主键。...你可以使用主键来查询数据。 **外键:**外键用于关联两个表。 复合键:复合键(组合键)将多个列作为一个索引键,一般用于复合索引。 **索引:**使用索引可快速访问数据库表中的特定信息。...索引是对数据库表中一列或多列的值进行排序的一种结构。类似于书籍的目录。 参照完整性: 参照的完整性要求关系中不允许引用不存在的实体。...数据仓库:能平滑迁移至同属 PostgreSQL 生态的 GreenPlum,DeepGreen,HAWK 等,使用 FDW 进行 ETL。
数据库DDL(注意创建顺序) 为了直接运行DDL语句并创建表,我们需要确保在创建含有外键约束的表之前,相关的被引用表(即外键指向的表)已经存在。...所以我们在创建表的时候一定要按照一定的顺序来创建,否则就会出现没有外键关系导致的创建异常。...非主键列必须完全依赖于主键,而不能只依赖于主键的一部分(针对复合主键而言)。 解释: 第二范式建立在第一范式的基础上,主要关注于主键与非主键列之间的依赖关系。...如果表中的某一列只与复合主键的一部分有关,那么它就不应该存在于这个表中,而应该被分离出去形成另外一张新表。 第三范式(3NF, Third Normal Form) 定义: 满足2NF。...它主要关注于消除传递依赖,即非主键列不应该依赖于主键的某一部分,而应该直接依赖于整个主键。 如果存在传递依赖,那么应该考虑将这个非主键列分离出去,形成新的表,并通过主键或外键与原表进行关联。