外键

EF Code First 导航属性 与外键

风格不统一 提交于 2020-02-04 02:34:45
一对多关系 项目中最常用到的就是一对多关系了。Code First对一对多关系也有着很好的支持。很多情况下我们都不需要特意的去配置,Code First就能通过一些引用属性、导航属性等检测到模型之间的关系,自动为我们生成外键。观察下面的类: public class Destination { public int DestinationId { get; set; } public string Name { get; set; } public string Country { get; set; } public string Description { get; set; } public byte[] Photo { get; set; } public List<Lodging> Lodgings { get; set; } } public class Lodging { public int LodgingId { get; set; } public string Name { get; set; } public string Owner { get; set; } public bool IsResort { get; set; } public decimal MilesFromNearestAirport { get; set; } public

MySQL三范式的通俗理解

流过昼夜 提交于 2020-02-03 12:21:34
第一范式 就是属性不可分割,每个字段都应该是不可再拆分的。比如一个字段是姓名(NAME),在国内的话通常理解都是姓名是一个不可再拆分的单位,这时候就符合第一范式;但是在国外的话还要分为FIRST NAME和LAST NAME,这时候姓名这个字段就是还可以拆分为更小的单位的字段,就不符合第一范式了。 第二范式 就是要求表中要有主键,表中其他其他字段都依赖于主键,因此第二范式只要记住主键约束就好了。比如说有一个表是学生表,学生表中有一个值唯一的字段学号,那么学生表中的其他所有字段都可以根据这个学号字段去获取,依赖主键的意思也就是相关的意思,因为学号的值是唯一的,因此就不会造成存储的信息对不上的问题,即学生001的姓名不会存到学生002那里去。 第三范式 就是要求表中不能有其他表中存在的、存储相同信息的字段,通常实现是在通过外键去建立关联,因此第三范式只要记住外键约束就好了。比如说有一个表是学生表,学生表中有学号,姓名等字段,那如果要把他的系编号,系主任,系主任也存到这个学生表中,那就会造成数据大量的冗余,一是这些信息在系信息表中已存在,二是系中有1000个学生的话这些信息就要存1000遍。因此第三范式的做法是在学生表中增加一个系编号的字段(外键),与系信息表做关联。 来源: CSDN 作者: 番茄鸡蛋挂面 链接: https://blog.csdn.net/Min_Chander

教你用MySQL导出一个ER图功能

北城余情 提交于 2020-02-01 20:00:46
教你用MySQL导出一个ER图功能 MySQL数据字典相关的sql查询和navicat的一个导出ER图功能 ##mysql 查看表结构 SELECT COLUMN_NAME 'Field', COLUMN_TYPE 'Type', IS_NULLABLE 'Null', COLUMN_KEY 'Key', COLUMN_DEFAULT 'Default', COLUMN_COMMENT 'Comment' FROM INFORMATION_SCHEMA.COLUMNS WHERE table_schema = 'dbname' ##数据库名 AND table_name = 'tableName' ##数据库表名 ##mysql 查看索引 show index from tableName ##统计数据库中外键数量 select count(1) from (select TABLE_NAME,CONSTRAINT_NAME from INFORMATION_SCHEMA.KEY_COLUMN_USAGE where CONSTRAINT_NAME like '%fk%' ##约束名,这里限制的是外键 and TABLE_NAME = 'tableName' ##子表名,设置外键的表;REFERENCED_TABLE_NAME父表名,子表外键关联的表 and REFERENCED

rails笔记 activerecord 关系

梦想的初衷 提交于 2020-02-01 10:14:49
actuverecord realation convention 约定 对应关系: 普通对象: Person -> people table -> person_id join_table: tablenamea_tablenameb 为table名(按照字母顺序排列) 关系 注意belongs_to对应的表 必须有外键 , rails认为一个表belongs_to他外键引用的表 one-to-one class Order one-to-many: belongs_to class Order many-to-many class Product one-to-one 下面两个操作在逻辑在等价 order.invoce=invo auto invo.save 注意1 当把子对象赋给父的时候(order.invoce=invo),子对象如果未存储会自动存储(auto invo.save),但是把父赋给子的时候(invo.order=ord)不会自动存储, 因为此时存储order没有意义, 对应关系是保存在invoces表中的,不过在稍后的invo.save中, 如果父没有创建,还是会自动创建的 注意2 当使用上门的自动存储的时候,由于调用的save方法,所以即使出错也不会报告,所以最好还是自己来invo.save!(比如invo有内部验证的时候),然后在建立连接关系

Mysql-外键与事务

99封情书 提交于 2020-02-01 04:26:27
1.外键 1.1 概念: a.什么是外键 外键约束是指有关联的两个数据表之间的跨表条件约束。 b.为什么使用外键 ? 1.保证主表和从表数据的合理性。 2.防止误删主表数据。 3.限制不合理数据插入从表。 2.2 使用外键 a.外键添加 语法: alter table 从表 add [constraint 约束名字] foreign key (外键字段) references 主表(关联字段) [操作]; b.外键删除 语法: alter table 从表 drop foreign key 约束名字; c.外键高级 语法: alter table 从表 add [constraint 约束名字] foreign key (外键字段) references 主表(关联字段) [on delete {级别}] [on update {级别}] 分为3个级别的操作: 1.严格限制:restrict。严格限制不允许任何操作。默认就是严格限制。 2.级联操作:cascade。主表(关联字段)更新或删除时,从表也跟着改变。 3.置NULL:set null。主表(关联字段)更新或删除时,从表置NULL。 d.外键注意事项 1. 2个表的引擎必须是InnoDB。 2. 2个表的关联字段数据类型必须一致。 3. 创建外键的字段必须是索引类型,如果不是,系统会自动创建。 4.

SQL类型及约束

血红的双手。 提交于 2020-02-01 01:55:51
常见数据类型 数值型 ⑴.整型 ①.分类: Tinyint(1)、Smallint(2)、Mediumint(3)、Int(4)、integer(4)、Bigint(8) ②.特点: ⒈默认是有符号的,如果要无符号后边添加UNSIGNED。 ⒉如果插入的值超出范围,发出警告,插入临界值。 ⒊有默认长度int(11),无符号int(10)。 ⒋自己设置长度和范围无关(范围只和类型有关),如果自己设置长度后,位数不够会用0填充(必须搭配zerofill,默认会变为无符号)。 ⑵.小数 ①.分类 浮点数: float(M,D)4、double(M,D)8 定点数: DEC(M,D) ②.特点 ⒈M:整数部位和小数部位总位数,D:小数位数。 ⒉如果超出范围插入临界值。 ⒊M和D都可以省略,但定点型(M,D)默认为(10,0),float和double随插入精度决定。 字符型 ⑴.较长的文本 text、blob(存二进制)。 ⑵.较短的文本 char(M)、 varchar(M)、 enum('a','b','c')列表中一个不区分大小写、 set('a','b','c')中多个,insert into 表 values ('a,b')不区分大小写。 特点: M:最大字符数 char是固定长度字符,M是多少默认开多大空间,可省略(M)默认为1(较耗费空间,但效率会高点)。

mysql数据库 day03

Deadly 提交于 2020-01-31 00:15:51
---恢复内容开始--- 1.外键(重点) 2.修改表的完整语句(了解知识点) 一.外键 外键一共分为三大类:一对多,多对多,一对一 1.一对多: 为什么要有这些外键了: 比如说定义了一张员工表 # 定义一张部门员工表 id name gender dep_name dep_desc 1 jason male 教学部 教书育人 2 egon male 外交部 漂泊游荡 3 tank male 教学部 教书育人 4 kevin male 教学部 教书育人 5 owen female 技术部 技术能力有限部门 那么这张表有什么问题 ?: 把所有的数据都存放在一张表的弊端: 1.表的结构不清晰 2.浪费硬盘空间(因为有相同的部门,需要重复写) 3.表的扩展性极差(无法忽略的缺点) 这个问题就类似我们将所有的代码都写在用一个py文件内 那么我们该怎么解决这个问题:(我们要把表分开,解耦和)           emp id emp_name emp_gender dep_id 1 jason male 1 2 egon female 2 3 tank male 2 4 jerry male 2 5 kevin male 3             dep id dep_name dep_desc 1 外交部 形象代言人 2 教学部 教书育人 3 技术部 技术能力有限部门 表示解耦和了

外键、表与表之间的关系

六眼飞鱼酱① 提交于 2020-01-30 22:50:26
今日学习总结: 一、外键:用来建立两张表之间的关系 外键的约束的条件: 需要先提前建立被关联表 级联更新级联删除 1、一对多 2、多对多 3、 一对一 注意:mysql中 没有 多对一 1. 一对多 01、创建两张表:必须先建立被关联表,再建立关联表 dep: # 被关联表: create table dep( id int primary key auto_increment, # 主键+自增 dep_name varchar(16), dep_desc varchar(255) ); emp: # 关联表: create table emp( id int primary key auto_increment, name varchar(16), age int, gender enum('male', 'female', 'others') default 'male', dep_id int not null, foreign key(dep_id) references dep(id) # 外键:foreign key(dep_id) 。references dep 表示关联 被关联表 02、插入数据: 必须先插入被关联表(dep)的数据,再插入关联表(emp)的数据 # dep: insert into dep(dep_name, dep_desc) values(

为什么不推荐使用外键

耗尽温柔 提交于 2020-01-29 02:56:54
外键的优点 一、数据一致性 由数据库自身保证数据一致性、完整性会更可靠,程序很难100%保证数据的一致性、完整性 二、ER图可靠性 有主外键的数据库设计可以增加ER图的可读性 外键的缺点 一、级联问题 阿里巴巴的开发手册中,就曾指出强制要求不允许使用外键,一切外键概念必须在应用层解决。 因为每次级联delete或update的时候,都要级联操作相关的外键表,不论有没有这个必要,由其在高并发的场景下,这会导致性能瓶颈 二、增加数据库压力 外键等于把数据的一致性事务实现,全部交给数据库服务器完成,并且有了外键,当做一些涉及外键字段的增,删,更新操作之后,需要触发相关操作去检查,而不得不消耗资源 三、死锁问题 若是高并发大流量事务场景,使用外键还可能容易造成死锁 四、开发不方便 有外键时,无论开发还是维护,需要手工维护数据时,都不太方便,要考虑级联因素 总结 一、如是单机且低并发,也不需要性能调优,再或者不能用程序保证数据的一致性,完整性,可以使用外键。 二、 如果为了高并发,分布式,使系统性能更优,以及更好维护,则一定不能使用外键 来源: CSDN 作者: 小夏陌 链接: https://blog.csdn.net/qq_22136439/article/details/103714369

数据库的创建和操作

不羁岁月 提交于 2020-01-28 21:41:11
创建和操作数据库 1.创建数据库的基本要求 【1】主数据文件:一个数据库有,且只能有一个。扩展名是.mdf。 【2】次要数据文件:可以根据需要添加多个,并且可以分布在不同的磁盘上。扩展名.ndf。 【3】日志文件:有且至少有一个日志文件,也可以多个。扩展名是.ldf。 2.数据库创建要思考的问题 【1】数据容量:根据需要预估。 【2】文件分布:根据容量大小,创建不同次要数据文件。分布存储。 3.基于T-SQL脚本创建数据库实例 1 use master--表示当前我们要在master数据库中操作 2 go --表示批处理结束,这个go非常重要,在必要的地方必须写,在不需要的地方,绝对不能写。 3 4 5 --我们在开发阶段,通会使用这种判断,查看数据库是否存在。因为我们会经常改动.如果数据库创建完毕,千万注意! 6 if exists(select * from sysdatabases where name='CourseManageDB') 7 drop database CourseManageDB 8 go 9 10 --创建数据库 11 create database CourseManageDB 12 on primary 13 ( 14 --数据库的逻辑文件名(系统使用的必须唯一,但是我们看不见) 15 name='CourseManageDB_data', 16 -