是否有必要使用外键?

StormFour 发布于 2012/07/06 16:05
阅读 6K+
收藏 1
@宏哥   根据你的经验,项目中是否真有必要使用外键?不用外键能增加系统性能,但不能保证数据的完整性,用了则相反。不用外键的话一般都是通过其他的逻辑处理来保证,这样真的利大于弊吗? 
加载中
2
宏哥
宏哥

外键只影响写入性能. 任何时候,都尽量用外键约束. 数据直接没有关系,数据就没有意义.

除非你用的不是数据库.

 你说的那个结论都是搞mysql的得出的. 我说过,mysql不是数据库.在mysql上使用外键,会让你整个系统挂掉. 搞open source 的低档家伙,在网络上叫的响,给大家造成非常广泛的坏影响.

否则脏数据处理,要花费大量的精力. 远超过系统开发的精力.

0
JustForFly
JustForFly
我们是开发用外键,上线删除外键。
0
宏哥
宏哥

任何信息,准确的判断,都需要知道 谁, 在什么场合,在什么时候, 为什么,说的是什么,

5W 分析法: Who, when, where,why,what

必须坚定不移贯彻关于两个凡是的讲话.

0
StormFour
StormFour
@宏哥 谢谢,个人也偏向于使用外键。之前看到关于不使用外键的帖子,当时就比较反对。但在现有的系统中我发现表关系竟然也发现不使用外键,让我感到很诧异(PS:现有系统中用的Oracle),不知道他们是出于什么原因的考虑。
0
sxgkwei
sxgkwei
反正我觉得有外键反而不爽,业务总在变,数据间的关系还是靠代码来维持方便自由点,不然业务一变,表与表直接有约束关系,那直接搞死人。
0
宏哥
宏哥

引用来自“StormFour”的答案

@宏哥 谢谢,个人也偏向于使用外键。之前看到关于不使用外键的帖子,当时就比较反对。但在现有的系统中我发现表关系竟然也发现不使用外键,让我感到很诧异(PS:现有系统中用的Oracle),不知道他们是出于什么原因的考虑。

懒是主要原因.

这个偷懒,代价会在以后加倍补回来.但是在公司里面,往往不是自己补. 所以.....

0
mark35
mark35

引用来自“宏哥”的答案

外键只影响写入性能. 任何时候,都尽量用外键约束. 数据直接没有关系,数据就没有意义.

除非你用的不是数据库.

 你说的那个结论都是搞mysql的得出的. 我说过,mysql不是数据库.在mysql上使用外键,会让你整个系统挂掉. 搞open source 的低档家伙,在网络上叫的响,给大家造成非常广泛的坏影响.

否则脏数据处理,要花费大量的精力. 远超过系统开发的精力.

不用外键,那么只能靠人以及此人写的代码来约束逻辑。那换了人,升级了代码,新增了新功能了呢?

反对外键的基本上都出于性能考虑,而这多半是因为mysql实在烂,烂得任何一个可以提升应用效率(比如交集、差集操作),可以提高查询性能(比如合并连接sort-merge join与散列连接hash join)的功能都会影响到数据库性能。所以它就是傻快,也只能是傻快。跑得快,死得快,一切都如过眼云烟,自然任何(数据)就不考虑价值了。

如果数据值价,那(数据库)性能用硬件去堆就行。只要能保证数据的完整性,自然也保证了数据的价值。

0
宏哥
宏哥

引用来自“mark35”的答案

引用来自“宏哥”的答案

外键只影响写入性能. 任何时候,都尽量用外键约束. 数据直接没有关系,数据就没有意义.

除非你用的不是数据库.

 你说的那个结论都是搞mysql的得出的. 我说过,mysql不是数据库.在mysql上使用外键,会让你整个系统挂掉. 搞open source 的低档家伙,在网络上叫的响,给大家造成非常广泛的坏影响.

否则脏数据处理,要花费大量的精力. 远超过系统开发的精力.

不用外键,那么只能靠人以及此人写的代码来约束逻辑。那换了人,升级了代码,新增了新功能了呢?

反对外键的基本上都出于性能考虑,而这多半是因为mysql实在烂,烂得任何一个可以提升应用效率(比如交集、差集操作),可以提高查询性能(比如合并连接sort-merge join与散列连接hash join)的功能都会影响到数据库性能。所以它就是傻快,也只能是傻快。跑得快,死得快,一切都如过眼云烟,自然任何(数据)就不考虑价值了。

如果数据值价,那(数据库)性能用硬件去堆就行。只要能保证数据的完整性,自然也保证了数据的价值。

这就是mysql 洗脑产生的坏结果. 很多人把这种"经验"带到其他方面.

给楼主举一个实际例子:

如果有一个订单, 你不知道是谁下的订单,也不知道买的是什么,更不知道东西要发到哪里去.

问题来了:

那么系统产生这样一个订单做什么?

所以一旦和价值相关. 

这种数据就在可能性上,应该绝对禁止产生. 但是,有时候这堆烂问题可以扔给别人,或者是故意的,出于政治目的, 不在讨论范围.

mark35
mark35
回复 @宏哥 : 项目重构,多一次项目经费~
宏哥
宏哥
回复 @mark35 : 突然想到, 如果数据丢了无所谓,那么要这个系统做啥? 哈哈
宏哥
宏哥
回复 @mark35 : 也是, 数据丢了都无所谓.
mark35
mark35
某些人对于mysql表损坏都不在乎,又怎么在乎这种逻辑错误呢~
0
中山野鬼
中山野鬼

引用来自“宏哥”的答案

引用来自“mark35”的答案

引用来自“宏哥”的答案

外键只影响写入性能. 任何时候,都尽量用外键约束. 数据直接没有关系,数据就没有意义.

除非你用的不是数据库.

 你说的那个结论都是搞mysql的得出的. 我说过,mysql不是数据库.在mysql上使用外键,会让你整个系统挂掉. 搞open source 的低档家伙,在网络上叫的响,给大家造成非常广泛的坏影响.

否则脏数据处理,要花费大量的精力. 远超过系统开发的精力.

不用外键,那么只能靠人以及此人写的代码来约束逻辑。那换了人,升级了代码,新增了新功能了呢?

反对外键的基本上都出于性能考虑,而这多半是因为mysql实在烂,烂得任何一个可以提升应用效率(比如交集、差集操作),可以提高查询性能(比如合并连接sort-merge join与散列连接hash join)的功能都会影响到数据库性能。所以它就是傻快,也只能是傻快。跑得快,死得快,一切都如过眼云烟,自然任何(数据)就不考虑价值了。

如果数据值价,那(数据库)性能用硬件去堆就行。只要能保证数据的完整性,自然也保证了数据的价值。

这就是mysql 洗脑产生的坏结果. 很多人把这种"经验"带到其他方面.

给楼主举一个实际例子:

如果有一个订单, 你不知道是谁下的订单,也不知道买的是什么,更不知道东西要发到哪里去.

问题来了:

那么系统产生这样一个订单做什么?

所以一旦和价值相关. 

这种数据就在可能性上,应该绝对禁止产生. 但是,有时候这堆烂问题可以扔给别人,或者是故意的,出于政治目的, 不在讨论范围.

@宏哥 讨论数据库的问题我一般不说话,因为我拒绝我的团队碰oracle。而且推荐使用mysql。但不得不说,大家,特别用mysql,从接触数据库就开始用mysql,天天把它如老婆一样,围着它转的人,冷静的想想,你究竟是在用问题来证明工具的存在价值,还是在用工具来解决问题?毕竟上述从头到尾都是只是碰mysql的朋友,你们不是mysql的推销员。。。

我写C,写了16年,之间学习和很多其他语言,最早学的是pascal,93年就学了。虽然一直坚持写C但我也非常清楚,C其实做很多东西,都不如其他语言。如果你从你认识“数据库”这三个字开始就使用mysql,一直到今天,则非常有必要多了解其他数据库,对同样问题的解决方式。以做比较,哪些,这个工具更好,哪些,那个工具更好。

附带说一句,我不用oracle不是我认为oracle不好,也不是用oracle不赚钱,相反,oracle很好,同时做oracle也赚钱,而是我希望我们未来能从oracle的一些客户中抢出一些单子而已。所以不用。这和oracle本身的好坏没有关系。

 

中山野鬼
中山野鬼
回复 @宏哥 : 所以搞地缘政治啊。哈。。多的不说了。
宏哥
宏哥
回复 @中山野鬼 : 有钱的家伙可能非常流氓, 进巷子之前,先炸一遍. 这种事情不好搞. 最好是选定niche market, 先避开那些拿m16的家伙,抢地主,等有了钱,再干他们.
Y-QTCe
Y-QTCe
近身肉搏战最好的武器是手枪
中山野鬼
中山野鬼
回复 @宏哥 : 进巷子,拼刺刀。和他玩枪,不是找死嘛。哈。
宏哥
宏哥
回复 @中山野鬼 : 这个事情就是这样,如果对方拿M16,你就用AK47, 或者更高级,活力更猛的家伙. 别拿刀上.
下一页
0
周翼翼
周翼翼

引用来自“中山野鬼”的答案

引用来自“宏哥”的答案

引用来自“mark35”的答案

引用来自“宏哥”的答案

外键只影响写入性能. 任何时候,都尽量用外键约束. 数据直接没有关系,数据就没有意义.

除非你用的不是数据库.

 你说的那个结论都是搞mysql的得出的. 我说过,mysql不是数据库.在mysql上使用外键,会让你整个系统挂掉. 搞open source 的低档家伙,在网络上叫的响,给大家造成非常广泛的坏影响.

否则脏数据处理,要花费大量的精力. 远超过系统开发的精力.

不用外键,那么只能靠人以及此人写的代码来约束逻辑。那换了人,升级了代码,新增了新功能了呢?

反对外键的基本上都出于性能考虑,而这多半是因为mysql实在烂,烂得任何一个可以提升应用效率(比如交集、差集操作),可以提高查询性能(比如合并连接sort-merge join与散列连接hash join)的功能都会影响到数据库性能。所以它就是傻快,也只能是傻快。跑得快,死得快,一切都如过眼云烟,自然任何(数据)就不考虑价值了。

如果数据值价,那(数据库)性能用硬件去堆就行。只要能保证数据的完整性,自然也保证了数据的价值。

这就是mysql 洗脑产生的坏结果. 很多人把这种"经验"带到其他方面.

给楼主举一个实际例子:

如果有一个订单, 你不知道是谁下的订单,也不知道买的是什么,更不知道东西要发到哪里去.

问题来了:

那么系统产生这样一个订单做什么?

所以一旦和价值相关. 

这种数据就在可能性上,应该绝对禁止产生. 但是,有时候这堆烂问题可以扔给别人,或者是故意的,出于政治目的, 不在讨论范围.

@宏哥 讨论数据库的问题我一般不说话,因为我拒绝我的团队碰oracle。而且推荐使用mysql。但不得不说,大家,特别用mysql,从接触数据库就开始用mysql,天天把它如老婆一样,围着它转的人,冷静的想想,你究竟是在用问题来证明工具的存在价值,还是在用工具来解决问题?毕竟上述从头到尾都是只是碰mysql的朋友,你们不是mysql的推销员。。。

我写C,写了16年,之间学习和很多其他语言,最早学的是pascal,93年就学了。虽然一直坚持写C但我也非常清楚,C其实做很多东西,都不如其他语言。如果你从你认识“数据库”这三个字开始就使用mysql,一直到今天,则非常有必要多了解其他数据库,对同样问题的解决方式。以做比较,哪些,这个工具更好,哪些,那个工具更好。

附带说一句,我不用oracle不是我认为oracle不好,也不是用oracle不赚钱,相反,oracle很好,同时做oracle也赚钱,而是我希望我们未来能从oracle的一些客户中抢出一些单子而已。所以不用。这和oracle本身的好坏没有关系。

 

不用想了, 如果一个项目要上oracle, 在10年到20年内, 是不会考虑换mysql的.

现在我发现了, 大家说mysql有存在的价值,主要因为他本身便宜,什么预算少什么的...上oracle的都不差钱,不要你省...

宏哥
宏哥
回复 @中山野鬼 : 如楼下说的. 其实两块是完全不重叠的市场.
周翼翼
周翼翼
回复 @中山野鬼 : 对啊,所以mysql的优势只在成本.所以你想用mysql抢不差钱的上oracle项目的生意,基本没门.
中山野鬼
中山野鬼
应用面还是有差距。有些应用,mysql确实不行,反过来也一样。你要个小规模的数据库,在小环境内使用,就是当个增删查改的小数据库用,折腾oracle做什么。
返回顶部
顶部