数据库主从表、关系;主、外键关系和作用(转)
从数据库是主数据库的备份,当主数据库变化时从数据库要更新,这些数据库软件可以设计更新周期。这是提高信息安全的手段。主从数据库服务器不在一个地理位置上,当发生意外时数据库可以保存。
主外键的关系结构:
1,一对一,不用引用主外键,把它们放一个表中即可
例如:一个学生只能有一个卡号,那么学生跟卡号放在一个表中即可
2,一对多,引用主外键,‘一’相当于主键,‘多’即是引用主键的外键。
例如:一个班级可以有多个学生,并且一个学生只能属于一个班级,这就是一对多的关系;
3,多对多关系,需要创建一个表,表中需要两个字段,分别是引用,两个多对多字段主键的外键。
例如:
学生表(学号,姓名,…………)主键:学号
课程表(课程号,课程名,…………)主键:课程号
一个学生能选多门课,一个课可以由多个学生选,即是多对多关系,
那么成绩表就是它们之间关系的体,
即引用成绩表(学号,课程号,成绩)。这里学号和课程号,分别是学生表和课程表中学号和课程号的外键
在我们现在这个阶段中,主要还是使用,主外键间的一对多的关系
主键Primary key,唯一标示一个实体。是保证数据库的实体完整性,保证数据中数据的正确性和合理性,取值非空唯一。
外键Foreign,是用来使表与表之间联系。用来保证数据库的参照完整性,外键的取值必须来自参照表参照列的值,可以为空也可不为空。
外键的作用:
保持数据一致性,完整性,主要目的是控制存储在外键表中的数据。 使两张表形成关联,外键只能引用外表中的列的值!
一、什么是主键、外键
关系型数据库中的一条记录中有若干个属性若其中某一个属性组(注意是
组)能唯一标识一条记录该属性组就可以成为一个主键
比如
学生表(学号姓名性别班级)
其中每个学生的学号是唯一的学号就是一个主键
课程表(课程编号,课程名,学分)
其中课程编号是唯一的,课程编号就是一个主键
成绩表(学号,课程号,成绩)
成绩表中单一一个属性无法唯一标识一条记录学号和课程号的组合才可
以唯一标识一条记录所以学号和课程号的属性组是一个主键
成绩表中的学号不是成绩表的主键但它和学生表中的学号相对应并且
学生表中的学号是学生表的主键则称成绩表中的学号是学生表的外键
同理成绩表中的课程号是课程表的外键
定义主键和外键主要是为了维护关系数据库的完整性总结一下
1.主键是能确定一条记录的唯一标识比如一条记录包括身份正号姓
名年龄。
身份证号是唯一能确定你这个人的其他都可能有重复所以身份证号
是主键。
2.外键用于与另一张表的关联。是能确定另一张表记录的字段用于保持
数据的一致性。
比如A表中的一个字段是B表的主键那他就可以是A表的外键。
二、主键、外键和索引的区别
主键、外键和索引的区别?
主键外键索引
定义唯一标识一条记录不能有重复的不允许为空表的外键是另一表
的主键,外键可以有重复的,可以是空值该字段没有重复值但可以有一个空值
作用用来保证数据完整性用来和其他表建立联系用的是提高查询排序的
速度
个数主键只能有一个一个表可以有多个外键一个表可以有多个惟一索引
聚集索引和非聚集索引的区别?
聚集索引一定是唯一索引。但唯一索引不一定是聚集索引。
聚集索引在索引页里直接存放数据而非聚集索引在索引页里存放的是
索引这些索引指向专门的数据页的数据。
三、数据库中主键和外键的设计原则
主键和外键是把多个表组织为一个有效的关系数据库的粘合剂。主键和外
键的设计对物理数据库的性能和可用性都有着决定性的影响。
必须将数据库模式从理论上的逻辑设计转换为实际的物理设计。而主键和
外键的结构是这个设计过程的症结所在。一旦将所设计的数据库用于了生产环
境就很难对这些键进行修改所以在开发阶段就设计好主键和外键就是非常
必要和值得的。
主键
系数据库依赖于主键---它是数据库物理模式的基石。
主键在物理层面上只有两个用途
1.惟一地标识一行。
2.作为一个可以被外键有效引用的对象。
基于以上这两个用途下面给出了我在设计物理层面的主键时所遵循的一
些原则
1.主键应当是对用户没有意义的。如果用户看到了一个表示多对多关系的
连接表中的数据并抱怨它没有什么用处那就证明它的主键设计地很好。
2.主键应该是单列的以便提高连接和筛选操作的效率。
注使用复合键的人通常有两个理由为自己开脱而这两个理由都是错误
的。其一是主键应当具有实际意义然而让主键具有意义只不过是给人为地
破坏数据库提供了方便。其二是利用这种方法可以在描述多对多关系的连接表
中使用两个外部键来作为主键我也反对这种做法理由是复合主键常常导
致不良的外键即当连接表成为另一个从表的主表而依据上面的第二种方法
成为这个表主键的一部分然这个表又有可能再成为其它从表的主表其主
键又有可能成了其它从表主键的一部分如此传递下去越靠后的从表其主
键将会包含越多的列了。
3.永远也不要更新主键。实际上因为主键除了惟一地标识一行之外再
没有其他的用途了所以也就没有理由去对它更新。如果主键需要更新则说
明主键应对用户无意义的原则被违反了。
注这项原则对于那些经常需要在数据转换或多数据库合并时进行数据整
理的数据并不适用。
4.主键不应包含动态变化的数据如时间戳、创建时间列、修改时间列等。
5.主键应当有计算机自动生成。如果由人来对主键的创建进行干预就会
使它带有除了惟一标识一行以外的意义。一旦越过这个界限就可能产生认为
修改主键的动机这样这种系统用来链接记录行、管理记录行的关键手段就
会落入不了解数据库设计的人的手中。
四、数据库主键选取策略
我们在建立数据库的时候需要为每张表指定一个主键所谓主键就是能
够唯一标识表中某一行的属性或属性组一个表只能有一个主键但可以有多
个候选索引。因为主键可以唯一标识某一行记录所以可以确保执行数据更新、
删除的时候不会出现张冠李戴的错误。当然其它字段可以辅助我们在执行这
些操作时消除共享冲突不过就不在这里讨论了。主键除了上述作用外常常
与外键构成参照完整性约束防止出现数据不一致。所以数据库在设计时主
键起到了很重要的作用。
常见的数据库主键选取方式有
·自动增长字段
很多数据库设计者喜欢使用自动增长型字段因为它使用简单。自动增长
型字段允许我们在向数据库添加数据时不考虑主键的取值记录插入后数
据库系统会自动为其分配一个值确保绝对不会出现重复。如果使用SQL
Server数据库的话我们还可以在记录插入后使用@IDENTITY全局变量获取系
统分配的主键键值。
·手动增长字段
·UniqueIdentifier
·"COMB(Combine)"类型