- TLDR:*
在mysql中,不声明一个表中与另一个表相关的行作为外键是一个好的做法吗?
- 说来话长 *
今天在一个关于mysql数据库设计的项目会议上,我正在展示测试模型时,团队负责人问道:“你把关系声明为外键了吗?”起初我很困惑,然后回答一个坚实的“是的!“我认为他是在测试我的知识,因为我对球队来说是一个新手,而且是一个晚辈。令我惊讶的是,他回答说:“哦,好吧,不管怎样,这很好”,好像不这样做会更好。另一个队员和我一样困惑。他在“它导致了无尽的级联”的曲调中添加了一些东西,但我不能进一步深入,因为会议是一个简短的日常会议,这个主题被放弃了。
后来他私下写信给我,他明显觉得有必要澄清。“并不是说声明外键是错误的,而是在大型数据库中带来了问题。因为这不是一个大的数据库,所以这不会是一个问题。”所以我问“如果你不声明它作为一个外键,然后呢?你只是把它作为一个int,然后“手动”把它们联系起来?”对于他基本上回答“是的”。
我不知道这是如何真正的工作关起门来,而不是如何教他们,或者他错了?是否有任何理由不为外键行声明外键?不受控制的级联的答案难道不是更多地了解数据库的工作方式和更好的设计吗?
- 上下文:*
我开始觉得我的队长并不像他表现的那么资深我想知道这是不是又一条线索。
我试着按照教的那样去做DB,并希望它是正确的。
1条答案
按热度按时间qlzsbp2j1#
外键对于维护数据完整性非常有用,可以确保数据库保持一致和干净。但它们并不总是完美的。在大型数据库中,它们可能会减慢速度,因为每次更改内容时,系统都必须确保这些外键仍然有意义。如果你不小心设置它们,你可能会不小心删除或更改你不想做的事情(这就是你的团队领导所说的“级联”)。
您的团队领导说您可以手动处理关系,尤其是在较大的数据库中,以提高性能,这并不一定是错误的。但是,手动执行也有其自身的问题--很容易出错,并最终得到不一致的数据。
所以,这不是外键普遍好或坏的情况。这取决于您的具体情况。对于较小的数据库,或者当数据完整性至关重要时,请使用外键。如果你正在处理一个巨大的数据库,你更关心的是速度,你有信心在你的应用程序代码中准确地处理关系,那么也许你可以不使用外键。