大家用 mysql 做项目的时候,是否用外键呢?

2014-08-20 18:38:32 +08:00
 gkiwi
目前公司倾向于用外键.个人倾向于不用外键,而将约束控制变更到代码逻辑里面进行控制(其实即使用了外键,该判断的大多还是会有的):

个人关于不用外键的理解:
1.方便模型的变更.(由模型导成sql,然后进行重建表很方便,而加上外键单独重建表只能挨个字段改了CRUD更方便)
2.性能会更好些

这里有篇文章介绍的文章http://www.cnblogs.com/tearer/archive/2010/07/25/1784896.html
===
求各抒己见.
8107 次点击
所在节点    程序员
33 条回复
maga
2014-08-20 19:41:35 +08:00
智商一直够不到使用外键-.- 外健一起好难理解
wingoo
2014-08-20 19:48:34 +08:00
不用,控制如你所说在代码里
loading
2014-08-20 20:00:04 +08:00
个人不用


但有人喜欢用教科书的什么范式考我~

有一次数据库结构不是我定,虽然应用不需要考虑性能(访问和数据量少),没有索引,实质数据列精简到极限,无一个相同,很多时候 on都涉及到超级长的 a.uuid=b.uuid
maemual
2014-08-20 20:33:01 +08:00
公司明确规定不让用外键
Mac
2014-08-20 21:12:44 +08:00
公司平台第一版的时候用过外键,但随着表结构的不断复杂,就开始改用JOIN了,另一个重要原因是备份比较简单。
mahone3297
2014-08-20 21:59:37 +08:00
用了symfony,entity之间的关联,doctrine直接使用外键。。。
之前我也不太推荐用外键。。。现在有点倾向外键。。。
ps:ror应该也是用外键的吧?
wengang285
2014-08-20 22:10:47 +08:00
之前在学校读书的时候,做项目,按照教科书上的东西,表设计的时候都用到外键;后来发现外键其实没必要,在逻辑层控制就好了,表耦合性太大也不好
mengzhuo
2014-08-20 22:10:51 +08:00
根本就没有理由不用外键
所有说辞只有一个原因---懒
嫌麻烦的,请用ORM和Model迁移程序

就不说性能上的提升,建索引的效率提升
工程上
外键解决了程序员意外删column的可能
瞬间能理清关系,方便后来的人导出ER图,不存在盲区
gkiwi
2014-08-20 22:35:05 +08:00
@mengzhuo

"懒"这个字用的好.

划去各种性能限制不说,毫无疑问,外键稍多一些,来回删除修改数据会非常的浪费时间.而我现在项目刚起步,常常要变更表结构,改动时候,单个表的sql根本无法拿出来执行(因为必须修改/删除一些主键),而无主键的时候,直接删表重建就好了.

楼上#5 提到备份之类的问题,数据导入时候先后顺序都需要一定顺序.

这些都得浪费不少时间,而且常常是重复性的机械劳动,这个都是时间啊(人月)!!
===
另外像你说的,几点就是涉及到: 表,er图,model三部分的生成问题.是先哪部分,再哪部分的.从直观性来讲,最简单的就是先做ER图,毕竟图形的好设计,而不是直接写sql再导出成er图.

我不反对在er图上设立外键,但是从er图到table时候,更倾向于忽略外键,直接出表.
lyragosa
2014-08-20 22:39:52 +08:00
不用

所有的跨表约束全部在程序上解决。
XadillaX
2014-08-21 00:52:20 +08:00
我也不喜欢,都喜欢在程序解决
konakona
2014-08-21 04:25:51 +08:00
不用。
lightening
2014-08-21 05:47:41 +08:00
ActiveRecord 会自动用的……
tonghuashuai
2014-08-21 08:57:56 +08:00
个人不用,hold 不住
cxh116
2014-08-21 08:59:59 +08:00
@mahone3297
@lightening

ROR也没有用到外键约束,就一普通的int字段而已
删除数据时方便,需要级联删除自己在程序里配置好逻辑

不过像用户名这种字段的唯一约束推荐加上,碰到几次手机端连续点击,并发导致数据出现重复
RangerWolf
2014-08-21 09:34:27 +08:00
个人项目我也不用~ 同楼主说的各种变动太多了~
后来我直接用mongo了 代码逻辑层想干嘛就干嘛 哈哈!
odirus
2014-08-21 09:34:58 +08:00
表设计的字段一致,在开发过程中使用外键,生产环境中取消外键,自己跑测试用例的时候能够发现是否写糊涂了。
wintersun
2014-08-21 09:46:36 +08:00
一分为二的看:
1、企业应用强调数据强一致性,性能因为规模的关系,不是主要考虑因素,建议用外键;
2、互联网应用则通常相反,强调性能而相对不着重数据强一致性(只是相对),不用外键对数据操作有性能提升助力,搜索问题则通常采用第三方搜索引擎系统效率更高。

场景不同,着重点不同,采取的策略不同!
6711411
2014-08-21 09:55:59 +08:00
@lightening ActiveRecord 没有用外键.
csensix
2014-08-21 09:57:12 +08:00
没用过

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/129008

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX