数据库外键使用

数据库到底用不用外键、触发器、索引、视图、存储过程 收藏

今天听了一个企业技术总监的宣讲,结果听说在他开发系统的过程中,都没有用到外键,这让我很惊讶,赶紧上网搜索了一些资料看了看,终于明白了不用外键的原因。
这是一篇关于是否使用外键的讨论,讲的很有道理:
对于主/外键/索引来说,在一些开发团队中被认为是处理数据库关系的利器,也被某些开发团队认为是处理某些具体业务的魔鬼,您的观点呢?在实际应用中您会采取哪种方式?
大家共同观点:主键和索引是不可少的,不仅可以优化数据检索速度,开发人员还省不其它的工作,
矛盾焦点:数据库设计是否需要外键。这里有两个问题:一个是如何保证数据库数据的完整性和一致性;二是第一条对性能的影响。
正方观点:1,由数据库自身保证数据一致性,完整性,更可靠,因为程序很难100%保证数据的完整性,而用外键即使在数据库服务器当机或者出现其他问题的时候,也能够最大限度的保证数据的一致性和完整性。eg:数据库和应用是一对多的关系,A应用会维护他那部分数据的完整性,系统一变大时,增加了B应用,A和B两个应用也许是不同的开发团队来做的。他们如何协调保证数据的完整性,而且一年以后如果又增加了C应用呢? 2,有主外键的数据库设计可以增加ER图的可读性,这点在数据库设计时非常重要。3,外键在一定程度上说明的业务逻辑,会使设计周到具体全面。
反方观点:1,可以用触发器或应用程序保证数据的完整性2,过分强调或者说使用主键/外键会平添开发难度,导致表过多等问题3,不用外键时数据管理简单,操作方便,性能高(导入导出等操作,在insert,   update,   delete   数据的时候更快)eg:在海量的数据库中想都不要去想外键,试想,一个程序每天要insert数百万条记录,当存在外键约束的时候,每次要去扫描此记录是否合格,一般还不止一个字段有外键,这样扫描的数量是成级数的增长!我的一个程序入库在3个小时做完,如果加上外键,需要28个小时!  
结论:1,在大型系统中(性能要求不高,安全要求高),使用外键;在大型系统中(性能要求高,安全自己控制),不用外键;小系统随便,最好用外键。2,用外键要适当,不能过分追求3,不用外键而用程序控制数据一致性和完整性时,应该写一层来保证,然后个个应用通过这个层来访问数据库。

时间: 2024-11-08 10:43:09

数据库外键使用的相关文章

开源进销存PSI - 数据库外键

今天在PSI的QQ群中聊起了数据库外键的话题,我就写这篇博文,说说我对数据库外键的一些考虑. 1.数据库设计中应该使用外键. 2.很杯具,PSI的数据库设计到目前为止,没有使用外键. 3.PSI会逐步把数据库外键给补上. 4.有些地方还真没法加上外键.举现在的例子: 4.1 t_warehouse_org中的org_id字段,即可以存储 t_org的id,又可以存储t_user的id,这个时候,外键就没法加了. 4.2 t_inventory_detail中的ref_number字段,可以存储多

[转载]数据库外键的使用

[转载]数据库外键的使用 外键的作用: 保持数据一致性,完整性,主要目的是控制存储在外键表中的数据. 使两张表形成关联,外键只能引用外表中的列的值! 例如: a b 两个表 a表中存有客户号,客户名称 b表中存有每个客户的订单 有了外键后 你只能在确信b 表中没有客户x的订单后,才可以在a表中删除客户x 建立外键的前提: 本表的列必须与外键类型相同(外键必须是外表主键). 指定主键关键字: foreign key(列名) 引用外键关键字: references <外键表名>(外键列名) 事件触

第二百八十节,MySQL数据库-外键链表之一对多

MySQL数据库-外键链表之一对多 外键链表之一对多 外键链表:就是a表通过外键连接b表的主键,建立链表关系 一对多:就是b表的某一个字段值对应a表外键里的多个值,前提是a表要与b表链表

SSH框架之Hibernate数据库外键如何插入值的问题

SSH框架之Hibernate数据库外键如何插入值的问题 一.目标: 现有表: 其中Tea_id属于外键,如何向含有外键的表中插入对应的数据. 二.pojos部分 Course_information .java package com.pojos; import java.util.Date; public class Course_information { private Integer Course_id; private String Course_name; private Inte

数据库外键的使用

外键的作用: 保持数据一致性,完整性,主要目的是控制存储在外键表中的数据. 使两张表形成关联,外键只能引用外表中的列的值! 例如: a b 两个表 a表中存有客户号,客户名称 b表中存有每个客户的订单 有了外键后 你只能在确信b 表中没有客户x的订单后,才可以在a表中删除客户x 建立外键的前提: 本表的列必须与外键类型相同(外键必须是外表主键). 指定主键关键字: foreign key(列名) 引用外键关键字: references <外键表名>(外键列名) 事件触发限制: on delet

深刻理解数据库外键含义

上课的时候老师讲的很清楚,但是毕竟没有实际操作数据库,思考和实践真的完全是不同层次的. 我的读者表里面全是学生这一类,外键约束使得学生这一类别在类别表中无法删除,就是因为读者表中的学生这一类在约束,试想没有学生这一类,那么读者表里面的学生类别怎么办呢?所以必须得先把读者表里面的学生全删没了,才能从类别表中去掉学生这一类.

SqlServer数据库外键的困惑

在设计数据库和备份数据的时候是否使用外键一直很纠结.先说一下外键的优缺点吧 优点:保证数据的完整性和一致性和可靠性,能做到一次修改所有使用外键的数据对应的信息都改变的作用 缺点:数据表增多,增加开发难度.降低(Insert.Update.Delete)速度 取代外键的方法:触发器.程序 订单一般是我们设计最多的数据了.下面以订单举个类子 订单一般会有客户.订单状态.产品.供应商等信息. 这些属性都有外键以及各自的描述信息,如果订单上只存在有这些信息的外键.会有以下几个问题. 1. 查询/新增/修

jango 模型管理数据model,数据库外键主键与一对一,一对多,多对多关系

四.models.py 定义和管理模型: 4.1模型class的属性就映射与数据库的字段参数 继承models.Model class TestClass(models.Model): 4.2在数据库生成数据表: #django默认在makemigrations会为表对象创建主键id,id = models.AutoField(primary_key=True) 你也可以自定义一个主键对象: 4.2.1: 生成迁移文件python manage.py makemigrations 4.2.2执行

django中的数据库外键操作

以MYSQL为例: (1)在model中定义两个数据表,食物信息和食物类别信息 class foodInfo(models.Model): food_id = models.AutoField(max_length=4)   #自定义主键,不指定主键默认会生成一个名为'ID'列的主键 food_name = models.CharField(max_length=10) food_content = models.CharField(max_length=100) food_price = mo