数据库到底用不用外键、触发器、索引、视图、存储过程_项目中使用主外键好一些还是视图好一些

img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

今天听了一个企业技术总监的宣讲,结果听说在他开发系统的过程中,都没有用到外键,这让我很惊讶,赶紧上网搜索了一些资料看了看,终于明白了不用外键的原因。

这是一篇关于是否使用外键的讨论,讲的很有道理:

对于主/外键/索引来说,在一些开发团队中被认为是处理数据库关系的利器,也被某些开发团队认为是处理某些具体业务的魔鬼,您的观点呢?在实际应用中您会采取哪种方式?

大家共同观点:
主键和索引是不可少的,不仅可以优化数据检索速度,开发人员还省不其它的工作,

矛盾焦点:数据库设计是否需要外键。这里有两个问题:一个是如何保证数据库数据的完整性和一致性;二是第一条对性能的影响。

正方观点:
1,由数据库自身保证数据一致性,完整性,更可靠,因为程序很难100%保证数据的完整性,而用外键即使在数据库服务器当机或者出现其他问题的时候,也能够最大限度的保证数据的一致性和完整性。
eg:数据库和应用是一对多的关系,A应用会维护他那部分数据的完整性,系统一变大时,增加了B应用,A和B两个应用也许是不同的开发团队来做的。他们如何协调保证数据的完整性,而且一年以后如果又增加了C应用呢? 
2,有主外键的数据库设计可以增加ER图的可读性,这点在数据库设计时非常重要。
3,外键在一定程度上说明的业务逻辑,会使设计周到具体全面。

反方观点:
1,可以用触发器或应用程序保证数据的完整性
2,过分强调或者说使用主键/外键会平添开发难度,导致表过多等问题
3,不用外键时数据管理简单,操作方便,性能高(导入导出等操作,在insert,   update,   delete   数据的时候更快)
eg:在海量的数据库中想都不要去想外键,试想,一个程序每天要insert数百万条记录,当存在外键约束的时候,每次要去扫描此记录是否合格,一般还不止一个字段有外键,这样扫描的数量是成级数的增长!我的一个程序入库在3个小时做完,如果加上外键,需要28个小时!

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

文章出处:http://www.diybl.com/course/7_databases/database_other/200838/103356.html

上面提到了触发器的概念,我这里用MYSQL举例

触发器的概念:“在数据库中为响应一个特殊表格中的某些事件而自动执行的程序代码。”(Wikipedia)说得简单一些,它是在一个特殊的数据库事件,如INSERT或DELETE发生时,自动激活的一段代码。触发器可方便地用于日志记录、对单个表格到其他链接式表格进行自动的“层叠式”更改、或保证对表格关系进行自动更新。当一个新整数值增加到数据库域中时,自动更新运行的总数的代码段是一个触发器。自动记录对一个特殊数据库表格所作更改的SQL命令块也是一个触发器实例。

触发器是MySQL 5.x的新功能,随着5.x代码树新版本的出现,这一功能也逐渐得到改善。在本文中,我将简单介绍如何定义并使用触发器,查看触发器状态,并如何在使用完毕后删除触发器。我还将为你展示一个触发器在现实世界中的应用实例,并检验它对数据库记录的改变。 

例子

通过简单(虽然是人为的)实例来说明是了解MySQL触发器应用的最佳办法。首先我们建立两个单域的表格。一个表格中为姓名列表(表格名:data),另一个表格中是所插入字符的字符数(表格名:chars)。我希望在data表格中定义一个触发器,每次在其中插入一个新姓名时,chars表格中运行的总数就会根据新插入记录的字符数目进行自动更新。

以下为引用的内容: mysql> CREATE TABLE data (name VARCHAR(255)); Query OK, 0 rows affected (0.09 sec) mysql> CREATE TABLE chars (count INT(10)); Query OK, 0 rows affected (0.07 sec) mysql> INSERT INTO chars (count) VALUES (0); Query OK, 1 row affected (0.00 sec) mysql> CREATE TRIGGER t1 AFTER INSERT ON data FOR EACH ROW UPDATE chars SET count  = count + CHAR_LENGTH(NEW.name); Query OK, 0 rows affected (0.01 sec)

理解上面代码的关键在于CREATE TRIGGER命令,它被用来定义一个新触发器。这个命令建立一个新触发器,假定的名称为t1,每次有一个新记录插入到data表格中时,t1就被激活。

在这个触发器中有两个重要的子句:

AFTER INSERT子句表明触发器在新记录插入data表格后激活。

收集整理了一份《2024年最新物联网嵌入式全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升的朋友。
img
img

如果你需要这些资料,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人

都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人**

都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 9
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
数据库设计规范文档应该包含以下方面: 1. 总体命名规范 - 定义命名规范的目的和原则 - 列出命名规范应包含的内容,如大小写、下划线等 - 给出命名规范的具体示例 2. 数据库名 - 给出数据库名称的规范 - 列出数据库命名的限制和约束 - 给出数据库名称的具体示例 3. 数据库文件 - 给出数据库文件的规范 - 列出数据库文件的限制和约束 - 给出数据库文件的具体示例 4. 表 - 给出表名的规范 - 列出表名的限制和约束 - 给出表名的具体示例 5. 属性(列或字段) - 给出属性名的规范 - 列出属性名的限制和约束 - 给出属性名的具体示例 6. 键 - 给出键的规范 - 列出键的限制和约束 - 给出键的具体示例 7. 外键 - 给出外键的规范 - 列出外键的限制和约束 - 给出外键的具体示例 8. 索引 - 给出索引的规范 - 列出索引的限制和约束 - 给出索引的具体示例 9. Default 标识 - 给出 Default 标识的规范 - 列出 Default 标识的限制和约束 - 给出 Default 标识的具体示例 10. Rule 标识 - 给出 Rule 标识的规范 - 列出 Rule 标识的限制和约束 - 给出 Rule 标识的具体示例 11. 自定义数据类型 - 给出自定义数据类型的规范 - 列出自定义数据类型的限制和约束 - 给出自定义数据类型的具体示例 12. 触发器 - 给出触发器的规范 - 列出触发器的限制和约束 - 给出触发器的具体示例 13. 视图 - 给出视图的规范 - 列出视图的限制和约束 - 给出视图的具体示例 14. 存储过程 - 给出存储过程的规范 - 列出存储过程的限制和约束 - 给出存储过程的具体示例 15. 函数 - 给出函数的规范 - 列出函数的限制和约束 - 给出函数的具体示例 16. 变量名 - 给出变量名的规范 - 列出变量名的限制和约束 - 给出变量名的具体示例 17. 角色 - 给出角色的规范 - 列出角色的限制和约束 - 给出角色的具体示例 18. 用户 - 给出用户的规范 - 列出用户的限制和约束 - 给出用户的具体示例 以上方面应该在数据库设计规范文档进行规范书写。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值