论数据库主外键的优劣

  在前段时间面试了一家算是正规的大公司,因为有工作经验,不用笔试直接进入技术面试,真心是抓瞎了。工作里,也许是自己不够上进,仅仅是学会了如何使用编程实现功能,没时间也不会去考虑性能的问题,真是失败,我都不好意思再说自己是程序员了。

  剖析下,面试遇到的问题。数据库的外键你认为有用么?遇到这个问题,瞬间想起了自己工作以来,在设计表的时候,会为表添加外键,但是在生成sql语句时,会不自觉的将外键这一项关闭。原因就是,外键会有约束,那么在增删改的时候,总是会有约束验证的问题,甚是反感。回归主题,分析外键的好与不好。

  主键的好处是不言而喻的,查找方便等等,换谁设计数据库,主键是必不可少的。

  外键的好:

  1、减少重复数据。在删除主表数据前要先删除与之相关的的子表的相关数据,原则上主表的数据是不允许删除的。

  2、可以设置级联删除和更新,保证数据库的完整性;

  3、外键在一定程度上说明了业务逻辑,会使设计周到具体全面。

  保证了数据的一致性,完整性,程序无法100%确保数据的完整性,从这个角度上来说,外键似乎很有必要,最主要无非是数据的完整性。

  外键的不好:

  1、过分强调或者说使用主键/外键会平添开发难度,导致表过多等问题;

  2、不用外键时数据管理简单,操作方便,性能高(导入导出等操作,在insert,   update,   delete   数据的时候更快);

  3、可以用触发器或应用程序保证数据的完整性;

  4、在结合hibernate的使用时,难以驾驭。

  别人的总结,借鉴之:

  1,在大型系统中(性能要求不高,安全要求高),使用外键;在大型系统中(性能要求高,安全自己控制),不用外键;小系统随便,最好用外键。
  2,用外键要适当,不能过分追求。
  3,不用外键而用程序控制数据一致性和完整性时,应该写一层来保证,然后个个应用通过这个层来访问数据库。

  自我总结

  外键在设计表的时候,还是很重要的,能看出数据的业务逻辑,毕竟罗马不是一天就造成的,Oracle公司在设计数据库的时候,肯定在外键这玩意儿上有所考虑,个人认为否定是没有意义的。但是在我的开发经验中,外键的设计就是作茧自缚,添加负担,在子表中添加一个字段用于放置外键,未尝不可。至于数据的唯一性,添加字段用于判断了。

(未完,经验尚浅,总结或许不对,还有待修正)

时间: 2024-10-08 20:04:45

论数据库主外键的优劣的相关文章

数据库主外键

主键Primary key,唯一标示一个实体.是保证数据库的实体完整性,保证数据中数据的正确性和合理性,取值非空唯一. 外键Foreign,是用来使表与表之间联系.用来保证数据库的参照完整性,外键的取值必须来自参照表参照列的值,可以为空也可不为空. 外键的作用: 保持数据一致性,完整性,主要目的是控制存储在外键表中的数据. 使两张表形成关联,外键只能引用外表中的列的值! 主外键的关系结构: 1,一对一,不用引用主外键,把它们放一个表中即可 例如:一个学生只能有一个卡号,那么学生跟卡号放在一个表中

数据库主外键约束

--增加表cw_users的外键约束fk_users_group,表中的group_id受表cw_users_group中的主键id约束begin transactionalter table cw_users add constraint fk_users_groupforeign key (group_id)references cw_users_group([id]) on update cascade on delete cascadecommit transaction

数据库主外建适用场景

主键和索引是不可少的,合理使用可以优化数据检索速度 焦点:数据库设计是否需要外键.这里有两个问题: 一.如何保证数据库数据的完整性和一致性: 二.创建外键对性能的影响. 正方观点:1,由数据库自身保证数据一致性,完整性,更可靠,因为程序很难100%保证数据的完整性,而用外键即使在数据库服务器当机或者出现其他问题的时候,也能够最大限度的保证数据的一致性和完整性.eg:数据库和应用是一对多的关系,A应用会维护他那部分数据的完整性,系统一变大时,增加了B应用,A和B两个应用也许是不同的开发团队来做的.

Django 外键、多对多插入数据方法

models.py class UserInfo(models.Model): username = models.CharField(max_length=64,db_column='username') passwd = models.CharField(max_length=64,db_column='password') register_date = models.DateTimeField(max_length=32,db_column='register_date') last_l

PHP数据连接主键与外键!

设置MySQL数据表主键: 使用"primary key"关键字创建主键数据列.被设置为主键列不允许出现重复的值,很多情况下与"auto_increment"递增数字相结合.如下SQL语句所示: Mysql>create table books(bookid int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,bookname varchar(50)); Mysql>insert into books(bookname

MySQL DDL操作--------外键最佳实战

1. 背景 * MySQL有两种常用的引擎类型MyISAM和InnoDB.目前只有InnoDB引擎类型支持外键约束. * 本表的列必须与外键类型相同, 外键必须是外表的主键 * 设置外建的列不能设置 NO NULL 字段属性. 2. 外建作用 * 使两张表形成关联,外键只能引用外表中的列的值 * 保持数据一致性,完整性,控制存储在外键表中的数据 3. 外键实验 [ 员工 --> 部门 ] * 创建外键依赖的外表 departments mysql> CREATE TABLE departmen

主键外键

主键 外键 唯一键 CHECK约束 主键:是唯一的,不可重复的,它能提高查询效率,但是会减慢新增数据效率 外键:主键是本张表的主键,是唯一且非空的,而外键是另一张表中与这张表的某个字段的类型,字段名相同的字段,一般是用作关联两张或两张以上的数据表时用的. 外间的取值规则:空值或参照的主键值. (1)插入非空值时,如果主键表中没有这个值,则不能插入. (2)更新时,不能改为主键表中没有的值. (3)删除主键表记录时,你可以在建外键时选定外键记录一起级联删除还是拒绝删除.(4)更新主键记录时,同样有

SQL反模式学习笔记5 外键约束【不用钥匙的入口】

2014-10-11 14:53:20 目标:简化数据库架构 一些开发人员不推荐使用引用完整性约束,可能不使用外键的原因有一下几点: 1.数据更新有可能和约束冲突: 2.当前的数据库设计如此灵活,以至于不支持引用完整性约束: 3.数据库为外键建立的索引会影响性能: 4.当前使用的数据库不支持外键.比如MySQL的MyISAM存储引擎,或者比SQLite3.6.19早的版本: 5.定义外键的语法并不简单,还需要查阅. 反模式:无视约束,即不使用约束 省略外键约束能使得数据库设计更加简单.灵活,或者

SQL 数据库主键 ,外键

主键 数据库主键是指表中一个列或列的组合,其值能唯一地标识表中的每一行.这样的一列或多列称为表的主键,通过它可强制表的实体完整性.当创建或更改表时可通过定义 PRIMARY KEY约束来创建主键.一个表只能有一个 PRIMARY KEY 约束,而且 PRIMARY KEY 约束中的列不能接受空值.由于 PRIMARY KEY 约束确保唯一数据,所以经常用来定义标识列. 主键的作用 主键的主要作用如下: (1)保证实体的完整性: (2)加快数据库的操作速度: (3) 在表中添加新记录时,数据库会自