描述 post_id BIGINT 帖子ID,主键 user_id BIGINT 发帖用户ID,外键,引用User表的user_id title VARCHAR 帖子标题 content TEXT 帖子内容...描述 comment_id BIGINT 评论ID,主键 user_id BIGINT 评论用户ID,外键,引用User表的user_id post_id BIGINT 所评论的帖子ID,外键,引用Post...表的post_id parent_comment_id BIGINT 父评论ID,如果是一级评论,此字段为NULL reply_to_comment_id BIGINT 被回复的评论ID,如果是一级评论...,此字段为NULL reply_to_user_id BIGINT 被回复的用户ID,如果是一级评论,此字段为NULL content TEXT 评论内容 comment_time DATETIME 评论时间...updated_time DATETIME 更新时间 deleted_time DATETIME 删除时间 reply_to_comment_id和reply_to_user_id 只有当当前评论是对二级评论的回复是时为非
2.2 第二范式 在满足第一范式的基础上,不存在非关键字段(非主键字段)对任意候选键(主键,外键,没有主键时的唯一键)的部分函数依赖(存在与复合主键的情况下),就满足第二范式,复合主键在上一篇文章中已经介绍过..., name varchar(20) not null, age bigint, class_id bigint, -- 设置class_id...bigint, score decimal(5, 2), -- 设置student_id为student表student_id的外键 foreign key (student_id...) references student (student_id), -- 设置course_id为course表course_id的外键 foreign key (course_id)...insert into exam values (5,'钱七',96,null); select sum(math) from exam; 可以看出,最终的值并没有加上null ,并且,如果是非数值类型求和是没有意义的
优化设计第三步 数据库优化策略 1、选择小的数据类型 2、单独设计主键,并考虑分布式扩展 3、外键设计 (重要,我们之前开发都是直接使用的弱外键来设置主外键关系,而实际项目中,如果要是删除了主键对应的记录后...,外键表中的记录是没有删除的,这样对于数据库的数据是很容易混乱的,不便于维护,那我要是使用的是强外键的方式,这样直接删除主键记录,没有删除外键表中的记录,这样是要报错的,这样容易找到代码上的问题,外键的设计能对于数据完整性有一个好的约束...,当你开发的系统已经完全不会出现数据不完整的问题的时候,你可以考虑使用弱外键来关联表操作,也同时会省去外键消耗,具体的设置外键方法查考博客:外键及其约束理解) 4、索引设计 (对于业务上的字段,那些需要字段需要建立索引...(四)列的顺序,可读性问题 (五)定义主键和外键 数据表必须定义主键和外键(如果有外键)。 (六)选择键 (七)是否允许NULL 任何值和NULL拼接后都为NULL。...(九)选择数据类型 (十)优化并行 设计DB时就应该考虑到对并行进行优化,比如,timestamp类型。
-- 设置id为非空且唯一 create table student( id bigint not null unique , name varchar(50) default '张某...' ); 如果把键设置为非空且唯一,就会被设置为主键 -- 设置主键并指定自增类型 create table student( id bigint primary key auto_increment...值 在上面的全列插入写入数据时,不具体指定主键列的值,用null代替,会自动生成id,虽然说,主键是非空且唯一的,但由于设置了自增类型,所以当添加为null时,数据库会根据自增原则,自动生成 id...下面这个只有一个id列相同,name列不同,所以可以直接插入 2.5 外键约束 2.5.1 插入 外键约束语法: 外键约束用来将两张表的数据之间建立连接,从而保证数据的一致性和完整性 此时创建的两张表没有任何的主外键关系...,所以说插入一条不存在的班级编号在学生表里也是可以添加成功的 这时设置class表的id 为主键,student表的 class_id为id的外键 create table class ( id
优化设计第三步 数据库优化策略 1、选择小的数据类型 2、单独设计主键,并考虑分布式扩展 3、外键设计 (重要,我们之前开发都是直接使用的弱外键来设置主外键关系,而实际项目中,如果要是删除了主键对应的记录后...,外键表中的记录是没有删除的,这样对于数据库的数据是很容易混乱的,不便于维护,那我要是使用的是强外键的方式,这样直接删除主键记录,没有删除外键表中的记录,这样是要报错的,这样容易找到代码上的问题,外键的设计能对于数据完整性有一个好的约束...(四)列的顺序,可读性问题 (五)定义主键和外键 数据表必须定义主键和外键(如果有外键)。 (六)选择键 (七)是否允许NULL 任何值和NULL拼接后都为NULL。...(九)选择数据类型 (十)优化并行 设计DB时就应该考虑到对并行进行优化,比如,timestamp类型。...,都不要使用拼音来命名,过一段时间就完全不记得了,就用英文,即使英语不好设计的时候也需要设置为英文。
主键必须包含唯⼀的值,且不能包含 NULL 值。 每个表只能有⼀个主键,可以由单个列或多个列组成。 通常为每张表都指定⼀个主键,主键列建议使⽤BIGINT类型 比 主键=唯一+非空。...我们也可以给主键加入自增列标识: 我们在设置AUTO_INCREMENT前id列是不可以插入NULL,但是设置后,可以插入NULL,但是NULL会被转化id自增列的数据 我们也可以手动设置主键列的值...5:FOREIGN KEY 外键约束 外键⽤于定义主表和从表之间的关系 外键约束主定义在从表的列上,主表关联的列必须是主键或唯⼀约束 当定义外键后,要求从表中的外键列数据必须在主表的主键或唯⼀列存在或为...null, age int DEFAULT 18, class_id bigint, foreign key (class_id) references class(id) # 创建外键约束 )...; 查看表结构,Key列的值为MUL表⽰外键约束的列 正常插⼊数据 插⼊⼀个班级号为100的学⽣,由于主表中没有这个班级,插⼊失败 插⼊班级Id为NULL的记录,可以成功,表⽰当前学
,当read返回null时表示所有数据读取完毕。...references BATCH_JOB_EXECUTION(JOB_EXECUTION_ID) ); 字段 说明 JOB_EXECUTION_ID 与BATCH_JOB_EXECUTION表关联的外键...JOB_EXECUTION_ID JobExecution的主键,JobExecution::getId方法可以获取到该值 VERSION JOB_INSTANCE_ID 关联到JobInstace的外键...STEP_EXECUTION_ID StepExecute对应的主键 VERSION STEP_NAME Step名称 JOB_EXECUTION_ID 关联到BATCH_JOB_EXECUTION表的外键...) references BATCH_JOB_EXECUTION(JOB_EXECUTION_ID) ) ; 字段 说明 JOB_EXECUTION_ID 关联到JobExecution的外键,建立
反例 上面这个表就不符合第一范式,因为学校是一个对象,学校还可以再分,并且学校无法用基本数据类型表示。 1.1.3....候选键:可以唯⼀标识⼀⾏数据的列或列的组合,可以从候选键中选⼀个或多个当做表的主键 1.2.2....当有⼀⻔新课还没有学⽣参加考试取得成绩之前,那么这⻔新课在数据库中是不存在的,因为成绩为空时记录没有意义。...-第⼆范式强调的是部分函数依赖,当⼀张表中的主键只有⼀列时,天然满⾜第⼆范式 1.3 第三范式 1.3.1 定义 在满足第二范式的基础上,不存在非关键字段,对任意一候选键的传递依赖 1.3.2....• 关系:实体之间的联系,⽤菱形框表⽰,并标明关系的类型,并⽤直线将相关实体与关系连接起 -关系一般包括四种: 1对1,1对多,多对多,没有关系(不考虑) 5.2 关系的类型 5.2.1 ⼀对⼀关系
DEFAULT CHARSET=utf8 COMMENT='角色权限关联表'; 为了方便对表进行直接操作,此处没有创建表之间的外键关系。...DEFAULT CHARSET=utf8 COMMENT='用户角色关联表'; 为了方便对表进行直接操作,此处没有创建表之间的外键关系。...[] ,这个类型一般对应数据库中的BLOB、LONGVARBINARY以及一些二进制流相关的字段类型 注意: 由于Java中的基本类型会有默认值,例如当某个类中存在private int age字段时,...当使用age属性时,它总会有值。 因此在某些情况下,便无法实现age为null . 并且在动态SQL的部分,如果使用age !=null 进行判断,结果总会为true,因而会导致很多隐藏的问题。...另外,当有个多个参数的时候,通过参数注解@Parma设置参数的名字省去了手工构造Map参数的过程。
避免使用MySQL保留字 不要外键关联,一般用代码维护 一般都选择INNODB存储引擎 选择合适的字符集 如果数据库字段是枚举,就在comment注释清楚 时间类型的选择 不建议使用存储过程,触发器...比如 char(10) 表示字符长度是10,而 bigint (4) 表示显示长度是 4 个字节但是因为bigint实际长度是 8 个字节,所以bigint (4) 的实际长度就是8个字节。...,一般都建议将字段定义为 NOT NULL why?...NULL 值有可能会导致索引失效 如果将字段默认设置成一个空字符串或常量值并没有什么不同,且都不会影响到应用逻辑,那就可以将这个字段设置为 NOT NULL 评估哪块要加索引 首先,评估表的数据量,如果数据量只有几十行...,一般用代码维护 这个在阿里的java规范也有提到: 【强制】不得使用外键与级联,一切外键概念必须在业务层解决 使用外键存在性能问题、并发死锁问题、使用起来不方使等等。
在ORM框架中,一对一关系的映射可以使用外键映射、主键映射或者关联表映射来实现。二、主键映射的优点在基于主键映射的一对一关联关系中,实体关系被映射到表中,而不是使用外键或者中间表。...这种方式的优点是: 删除或更新数据库时不需要维护外键关系,因为在Hibernate中一对一关联关系使用同一个主键。 查询速度更快,因为查询操作只需要执行单个表的查询。...我们还在@JoinColumn注解中指定了外键对应的字段名为“user_id”。...这个实例中的主键映射形式如下:User表:CREATE TABLE user ( id BIGINT NOT NULL PRIMARY KEY, name VARCHAR(255));UserProfile...表:CREATE TABLE user_profile ( id BIGINT NOT NULL PRIMARY KEY, address VARCHAR(255), user_id
2.选择合适的字段类型 设计表时,我们需要选择合适的字段类型,比如: 尽可能选择存储空间小的字段类型,就好像数字类型的,从tinyint、smallint、int、bigint从左往右开始选择 小数类型如金额...字段长度一般设置为2的幂哈(也就是2的n次方)。’; 5,优先考虑逻辑删除,而不是物理删除 什么是物理删除?什么是逻辑删除?...NULL值有可能会导致索引失效 如果将字段默认设置成一个空字符串或常量值并没有什么不同,且都不会影响到应用逻辑, 那就可以将这个字段设置为NOT NULL。 9....不搞外键关联,一般都在代码维护 什么是外键呢? 外键,也叫FOREIGN KEY,它是用于将两个表连接在一起的键。...什么是存储过程 已预编译为一个可执行过程的一个或多个SQL语句。 什么是触发器 触发器,指一段代码,当触发某个事件时,自动执行这些代码。使用场景: 可以通过数据库中的相关表实现级联更改。
-BIGINT 大小:8字节 浮点数据类型: - FLOAT 大小:4字节 精度:7位小数 - DOUBLE 大小:8字节 精度:15位小数 字符串数据类型: - VARCHAR 范围:0-65535...其中要注意的是VARCHAR需要在括号内设置字符串的最大长度。 刷新之后就可以看到我们创建的数据库中多了一张表: ? 选择打开表可以直观的看到内容: ?...分类: 1.实体完整性 保证一行数据是有效的 2.域完整性 保证一列数据是有效的 3.引用完整性 保证引用的编号是有效的 4.用户自定义完整性 保证自定义规则 实体完整性--主键约束:...引用完整性--外键约束: 外键约束是指在外键关联主键上强制加上一个约束,如果违反该约束,则不允许该条数据的修改。...); ) 创建从表--学生表,并设置外键约束: CREATE TABLE t_student( student_id INT PRIMARY KEY,
表必须有主键,推荐使用 UNSIGNED 整数为主键 潜在坑:删除无主键的表,如果是 row 模式的主从架构,从库会挂住 禁止使用外键,如果要保证完整性,应由应用程式实现 说明:外键使得表之间相互耦合...说明:其中 id 必为主键,类型为 unsigned bigint、单表时自增、步长为 1。...当某一列的值全是 NULL 时,count(col) 的返回结果为 0,但 sum(col) 的返回结果为 NULL,因此使用 sum() 时需注意 NPE 问题。...不得使用外键与级联,一切外键概念必须在应用层解决。 说明:以学生和成绩的关系为例,学生表中的 `student_id` 是主键,那么成绩表中的 `student_id` 则为外键。...外键与级联更新适用于单机低并发,不适合分布式、高并发集群;级联更新是强阻塞,存在数据库更新风暴的风险;外键影响数据库的插入速度。
当您的 CQL 表具有复合主键时,您必须创建一个@PrimaryKeyClass来定义复合主键的结构。在这种情况下,“复合主键”是指一个或多个分区列可选地与一个或多个集群列组合。...主键可以使用任何单一的简单 Cassandra 类型或映射的用户定义类型。不支持集合类型的主键。 简单的主键 一个简单的主键由实体类中的一个分区键字段组成。...组合键的最简单形式是具有一个分区键和一个集群键的键。...但是,如果firstname和lastname列值实际上null在结果集中,则整个属性name将null根据onEmptyof进行设置@Embedded,null当所有嵌套属性都为 时,该s 对象null...索引创建为标量类型、用户定义类型和集合类型创建简单的二级索引。
AnyField string `orm:"-"` ... } auto 当 Field 类型为 int, int32, int64, uint, uint32, uint64 时,可以设置字段为自增健...当模型定义里没有主键时,符合上述类型且名称为 Id 的 Field 将被视为自增健。..."` index 为单个字段增加索引 unique 为单个字段增加 unique 键 Name string `orm:"unique"` column 为字段设置 db 字段的名称 Name string...auto_now_add 第一次保存时才设置时间 对于批量的 update 此设置是不生效的 type 设置为 date 时,time.Time 字段的对应 db 类型使用 date Created...ManyToOne 的关系,也就是外键。
网状模型: 以实体型为节点的有向图表示各实体及其之间联系的模型。 关系模型: 用二维表格表示实体及其相互关系的模型。 ...(3)键的选用 主键(Primary Key) 组合键 (Concatenated Key) 候选键 (Candidate Key) 外键 (Foreign Key) ?... (4)关联类型 一对一 一对多 多对多 (5) 最后还有 第一二三范式 实体/参照/域完整性 主键/唯一/外键/默认约束 等等....,后一项是对应类型,varchar(15) 和char(15)差不多,只是后者固定了15个空间。 ...使用 alter table : alter table book add index/nique/rimary index_name; 其中三项为索引类型。
驱动作为外键放到设备表中....设备对象: 简单来说也是一个结构体,存储的是设备的各种信息. 但依据上面的数据关系来说. 设备对象中肯定会存储驱动对象结构体的指针. 驱动对象做外键存储到设备对象中....CSHORT Type; USHORT Size; LONG ReferenceCount; struct _DRIVER_OBJECT *DriverObject; //驱动对象做外键存储...&ustrDeviceName, //设备路径 FILE_DEVICE_UNKNOWN,//设备类型设置为不知道...//省略了两个成员,这两个成员一个是类型.一个是大小. .
utf8的锅 经验提示: 在设计数据表时,一定要注意该字段存储的内容,如果允许设置表情,则一定不能使用utf8,而是使用utf8mb4。...选择合适的类型 在数据库表设计时,字段的类型还真不好设计,这里简单说说: 保存手机号的字段,用varchar(20)就已经足够了,就不应该设计为varchar(100),设置为varchar(100)只会消耗更多的存储以及内存开销...保存Boolean类型,使用tinyint就够了,而不需要设计为int,甚至bigint。 数据类型设计的过大,就会造成没必要的浪费(磁盘,内存,CPU),最主要的是,这是一件费力不讨好的事情。...主键", user_id varchar(30) null comment "用户id" .... ) 你看,此时在t_base_user_address表中的user_id外键字段,设计时的却是varchar...小结 以上是我数据库设计表时躺过的坑,下面小结精简版本一下: 允许保存表情的表,存储格式设计为utf8mb4,避免使用utf8。 选择合适的数据类型。
领取专属 10元无门槛券
手把手带您无忧上云