大家在建表的时候都使用外键吗?
在上一家公司不准使用外键,新入职一家公司,发现数据表中使用了很多外键,不知道大家日常是怎么操作的?
在上一家公司不准使用外键,新入职一家公司,发现数据表中使用了很多外键,不知道大家日常是怎么操作的?
我的意见是,自己不确定 能不能用、需不要需要用 的时候,就不用
对于多表之间需要强数据一致性和完整性要求业务,且数据库会被不同语言或不同项目连接时, 我会用外键,因为不能保证别人或别的项目一定会知道,我这个项目要求哪些表之间数据是必须要有的。
但绝大部分一般业务我不会加数据库外键,因为大部分情况下,我们都在同一个项目下,使用同一套 编程语言别写的业务代码,来处理业务,而在业务层面,使用编程语言来约束更具有灵活性。
这倒没有,不用数据库外键,
不代表你自己编程语言业务里面不用外键,这种外键,就是“软外键”
(当然不同 Domain 之间数据库也断开直接关联,简单的一个外键引用,与代码一致)。
不用外键,编程上灵性,为了数据一致性,额外要做很多工作,数据库管理也麻烦。当然可以增加无脑打酱油的时间。
使用 Python, Ruby 的肯定都会用外键
不用外键,意味着不使用任何跨表查询。
但是实际开发实践中,“逻辑外键”还是广泛存在的,也就是用一个表中的字段值作为另外一个表的查询条件。含有 join 的语句也是允许的(但仅限 select 。update 和 delete 语句中不允许 join )
使用的好处是在数据库层来维护表间数据关联。但是,除非你是传统的 CS 程序,业务逻辑仍然以存储过程的形式编写,存在。现在一般是使用程序来建模,实现业务,相关逻辑更应该在代码,而非数据库层来进行维护。
使用数据层的坏处有
* 数据维护困难,某些数据的存在与删除由于外键、约束会导致很难维护
* 数据库层较难切换,同上
* 数据库升级麻烦,同上
现代设计更推荐将数据库仅视为存储与查询的简单组件,尽量较低业务依赖。