数据库设计要不要外键?

小星宇 2018-03-06 10:59:13
正在做毕业设计——网上求职招聘网站,刚开始建数据库,有点迷茫,使用的是mysql数据库,外键究竟是使用还是不使用?越想越困惑。。。想请教各位
...全文
1729 40 打赏 收藏 转发到动态 举报
写回复
用AI写文章
40 条回复
切换为时间正序
请发表友善的回复…
发表回复
weixin_40290083 2019-08-24
  • 打赏
  • 举报
回复
关系型数据库的关系就是通过主外键实现的,从数据的意文来讲没有多大意文,要保证数据的一致性,完整性,不冗余,那么主外键就必须有。越是复杂的业务,数据结构也必然复杂。越能体现主外键的好处,即使你不使用主外键,也有可能你要在自己的业务逻辑中自己实现对应关系
weixin_45270271 2019-08-23
  • 打赏
  • 举报
回复
如果你想操作多张表,那就要了,建立关系要的
编程写手 2019-08-14
  • 打赏
  • 举报
回复
建议不要用外键,外键就是一个约束,有的时候只要懂的表之间的关系,能省外键就省。有的时候不用外键是有好处的
皮皮熊_1989 2019-08-14
  • 打赏
  • 举报
回复 1
我来做个综合回答吧: 在大学学习的时候,为了让学生掌握表与表之间的关系和缜密的逻辑性,都会让在数据库设置外键约束,出发点是好的。 但在实际开发的过程中,1. 我们的需求经常变动,如果设立了外键约束,很多时候表不好改,牵一发动全身; 2. 互联网项目,尤其是高并发和很多用户的项目,过多设置外键约束,会严重影响数据库的性能,因为一些级联删除、更新等,都是数据库自己去做的。假设修改的表数据量超大,那么效率可想而知; 3. 一般来说,我们都是在应用层(不需要同一事务)或者数据交互层(同一事务,一个不成功全部回滚)从逻辑上去达到类似外键约束的效果; 4. 很多时候,外键约束的级联行为,不满足实际需要,比如:我删除一个数据,用这个数据的主键为外键并建立了外键约束级联删除时这个相关的数据都会被同时删除,可实际上,我们很多项目需要查看一些历史性的数据。比如,你去年买了个商品,商品类型是A,而今年这个A被删除了,但我还是需要知道去年我买的什么。 一般这种情况,数据库会有额外的字段作为逻辑删除字段,多半是bit类型的,如:is_deleted等标记是否逻辑删除。然后取数据的时候,自动通过sql或者EF的where过滤掉is_deleted=true的数据(一般来说,主表过滤,连接表一般不过滤。当然,实际业务为准)。 至于说外键省代码量,其实就是级联产生的效果。 综上,实际开发中,设数据库的外键约束,绝对绝对的弊大于利,一般都不设。
健者天行 2018-03-08
  • 打赏
  • 举报
回复
外键列需要, 外键关联约束可以不需要。
cattpon 2018-03-08
  • 打赏
  • 举报
回复
不需要~毕设要求不高
  • 打赏
  • 举报
回复
根据情况定啊,再说毕业设计和公司项目不一样
技乐书香 2018-03-07
  • 打赏
  • 举报
回复
互联网项目现在一般都不加外键,外键会导致子表的更新操作对父表产生锁,非常影响数据库的性能
李逍遥丶 2018-03-07
  • 打赏
  • 举报
回复
设置外键为数据库增加压力,现在的事务一般都在java里面处理
  • 打赏
  • 举报
回复
我之前做的一个国际电信业务,表全部都有外键,删除某条数据的时候,java必须先判断关联这条记录的数据有没有被删除(物理删除)。 后来在另一家公司做的一个仿淘宝的商城,表没有外键,数据管理又不严格,属于那种开发人员随意可以动生产数据那种(比如直接从库中删除某条数据),结果经常造成数据有问题。 现在做的公司某国有大型电商运维系统,数据逻辑删除,从页面上部分删除数据的时候,有的做校验,有的不做校验,不过问题不大。 我建议你开发的时候,还是遵循数据库三范式(虽然实际中并不全都适用,但至少在学习中知道怎么回事并会用,不要跟培训出来的一样只会用方法,不知其所以然),加外键,以后工作了按规定来就行了。
xiayiguo 2018-03-07
  • 打赏
  • 举报
回复
我们项目都不设置外键,没有必要
懒笑翻 2018-03-07
  • 打赏
  • 举报
回复
现在不怎么用外键了的 我们公司写项目都是直接列相关联 不直接设置外键
bzchao 2018-03-07
  • 打赏
  • 举报
回复
有其他参照表就需要外键
Fly天夏 2018-03-07
  • 打赏
  • 举报
回复
我建议不要用外键,业务控制好就ok
stronger35 2018-03-07
  • 打赏
  • 举报
回复
阿里JAVA开发手册建议不要使用外键
xiaoxiangqing 2018-03-07
  • 打赏
  • 举报
回复
看实际情况,一般是需要
hovoy 2018-03-07
  • 打赏
  • 举报
回复
外键又好又不好啊。两面性。
nettman 2018-03-07
  • 打赏
  • 举报
回复
关注,学习
java夜洛 2018-03-07
  • 打赏
  • 举报
回复
这个要分情况,我们现在做的项目就没有设置外键。 说明:(概念解释)学生表中的 student_id是主键,那么成绩表中的 student_id则为外键。 如果更新学生表中的 student_id,同时触发成绩表中的 student_id更新,则为级联更新。 外键与级联更新适用于单机低并发,不适合分布式、高并发集群;级联更新是强阻塞,存在数 据库更新风暴的风险;外键影响数据库的插入速度。
绝望星空 2018-03-07
  • 打赏
  • 举报
回复
真正的项目一般都不用外键
加载更多回复(19)
内容概要:本文针对无刷直流电机驱动的电子机械制动(EMB)执行器,建立了考虑Stribeck摩擦特性的非线性耦合动力学模型,并在Simulink环境中完成了系统级仿真分析。研究综合集成了电机动力学、齿轮传动机构与制动执行机构的动力学特性,构建了高保真的机电一体化系统模型。重点引入Stribeck摩擦模型以精确描述低速工况下执行器内部存在的静摩擦、粘滞摩擦与库仑摩擦之间的过渡行为,有效提升了系统在启停、反向运动等瞬态过程中的动态响应仿真精度。通过多工况仿真验证了模型的有效性,能够准确反映摩擦引起的爬行、滞后与定位误差等非线性现象,为EMB系统的高性能控制算法设计(如摩擦补偿、滑模控制)与结构优化提供了高可信度的仿真平台。; 适合人群:从事汽车电子制动系统、电机驱动控制、机电系统建模与仿真研究的研究生、科研人员及工程技术人员,需具备扎实的机械动力学、自动控制理论基础和MATLAB/Simulink仿真能力。; 使用场景及目标:①用于高精度电子机械制动系统的设计验证与性能预测;②为消除摩擦非线性影响的先进控制策略(如自适应控制、智能控制)提供精确的被控对象模型;③深入探究Stribeck摩擦等非线性因素对系统动态性能(如响应延迟、稳态误差)的作用机理; 阅读建议:读者应结合提供的Simulink模型文件,深入剖析Stribeck摩擦模块的数学实现与参数辨识方法,建议通过改变输入指令(如阶跃、正弦)和负载条件进行对比仿真,以直观理解非线性摩擦对系统动态特性的影响。

81,111

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧