是否在数据库中使用“外键”的讨论!
来源:互联网 发布:it领域 编辑:程序博客网 时间:2024/06/05 09:46
今天在群里和一个资深开发者讨论是否使用外键,对方是某大数据公司的技术骨干,十分反感使用外键,当然网上也有很多人这么认为,我就很奇怪不用外键你怎么确定数据行和行之间的关系了,他们说这叫“逻辑关系”,首先看一下“外键”的定义(参考百度词条)
外键的定义:如果公共关键字在一个关系中是主关键字,那么这个公共关键字被称为另一个关系的外键。由此可见,外键表示了两个关系之间的相关联系。以另一个关系的外键作主关键字的表被称为主表,具有此外键的表被称为主表的从表。外键又称作外关键字。
外键的作用:保持数据一致性,完整性,主要目的是控制存储在外键表中的数据。 使两张表形成关联,外键只能引用外表中的列的值或使用空值。
阻止执行:
从表插入新行,其外键值不是主表的主键值便阻止插入;
从表修改外键值,新值不是主表的主键值便阻止修改;
主表删除行,其主键值在从表里存在便阻止删除(要想删除,必须先删除从表的相关行);
主表修改主键值,旧值在从表里存在便阻止修改(要想修改,必须先删除从表的相关行)。
级联执行:
主表删除行,连带从表的相关行一起删除;
主表修改主键值,连带从表相关行的外键值一起修改。两种方法提供给用户选择。无论选取哪种方法,从表里都不会有多余行。从另一个角度理解,用拒绝同一事物在从表中的标志与主表不一致来实现与主表中的标志一致。
不管怎么看外键都是必须要使用的,那为什么这位网友和网上的帖子都反对使用“外键”了?仔细看了下我和他的对话,我发现问题在这里,首先描述数据行和行的关系,并且保持约束是利用“外键”或者说“逻辑关系”来完成,这一点肯定是没错,那么问题在那了?为什么会有2种不同的理解?我查了网上好像都没有人能说清楚。
真正的原因在这里,由数据库自带功能完成约束操作的方式是不可取的,不利于扩展,这一点是没有争议的。应该由软件或者说逻辑上完成约束操作,才是最佳做法,所以对方说的“逻辑关系”也没错。网上说的不用“外键”是指不用数据库自带的功能完成外键的约束。结论是“外键”在逻辑上还是存在,而且这个字段在表中是必须有的。
终于说清楚了,以后就不用争论了!!!
阅读全文
0 0
- 是否在数据库中使用“外键”的讨论!
- 关于数据库是否使用索引的讨论,我想说的
- 关于数据库是否用外键的讨论
- 关于在网页中使用IP的一次技术讨论
- 关于在c#和Java中使用“引用”的讨论
- 在脚本中, 使用sqlite3检查android程序生成的数据库是否OK
- 在脚本中, 使用sqlite3检查android程序生成的数据库是否OK
- 数据库中取随机数的方法讨论
- QTP查询“登记的用户”是否存在在数据库中
- 购物车的数据是否应该保存在数据库中?
- JAVA判断数据表是否在数据库中存在的方法
- 购物车的数据是否应该保存在数据库中?
- 购物车的数据是否应该保存在数据库中?
- 小讨论。。 在实际应用中给数据库加外键的约束好不好?
- 表是否在数据库中,字段是否存在表中
- 易语言----关于超级网页访问模块 在多线程的使用中 出错的问题 讨论
- iOS面试题(2.)关于在block中使用weakSelf的讨论
- 判断名称在数据库中是否存在
- 关于apk加壳之动态加载dex文件
- Java如何获取xml文件中子节点的属性
- 学生信息管理(数组)
- 使用getElementById获取xml中的指定元素
- 适配器模式
- 是否在数据库中使用“外键”的讨论!
- Oracle 表空间、用户
- 图的定义和术语
- RSA premaster secret error: SunTls12RsaPremasterSecret KeyGenerator not available
- MyBatis实战(一)
- 【Linux】IPC主题三 -------- 信号一(signal)
- 理解Linux中Load_average负载
- 人为什么会心累
- 项目开发心得体会