数据库外键的取舍

对于主/外键/索引来说,在一些开发团队中被认为是处理数据库关系的利器,也被某些开发团队认为是处理某些具体业务的魔鬼,您的观点呢?在实际应用中您会采取哪种方式?

大家共同观点:
主键和索引是不可少的,不仅可以优化数据检索速度,开发人员还省不其它的工作,

矛盾焦点:数据库设计是否需要外键。这里有两个问题:一个是如何保证数据库数据的完整性和一致性;二是第一条对性能的影响

 

2009-11-11 13:07 changShaHacker

正方观点:
1,由数据库自身保证数据一致性,完整性,更可靠,因为程序很难100%保证数据的完整性,而用外键即使在数据库服务器当机或者出现其他问题的时候,也能够最大限度的保证数据的一致性和完整性。
eg:数据库和应用是一对多的关系,A应用会维护他那部分数据的完整性,系统一变大时,增加了B应用,A和B两个应用也许是不同的开发团队来做的。他们如何协调保证数据的完整性,而且一年以后如果又增加了C应用呢? 
2,有主外键的数据库设计可以增加ER图的可读性,这点在数据库设计时非常重要。
3,外键在一定程度上说明的业务逻辑,会使设计周到具体全面

 

2009-11-11 13:08 TeDongDesiger

反方观点:
1,可以用触发器或应用程序保证数据的完整性
2,过分强调或者说使用主键/外键会平添开发难度,导致表过多等问题
3,不用外键时数据管理简单,操作方便,性能高(导入导出等操作,在insert,   update,   delete   数据的时候更快)
eg:在海量的数据库中想都不要去想外键,试想,一个程序每天要insert数百万条记录,当存在外键约束的时候,每次要去扫描此记录是否合格,一般还不止一个字段有外键,这样扫描的数量是成级数的增长!我的一个程序入库在3个小时做完,如果加上外键,需要28个小时!  

结论:
1,在大型系统中(性能要求不高,安全要求高),使用外键;在大型系统中(性能要求高,安全自己控制),不用外键;小系统随便,最好用外键。
2,用外键要适当,不能过分追求
3,不用外键而用程序控制数据一致性和完整性时,应该写一层来保证,然后个个应用通过这个层来访问数据库

欢迎各位发表观点...

### MySQL 数据库使用教程 #### 创建数据库并设置环境 为了展示的工作原理,先创建一个名为 `mysqltestdb` 的数据库,并切换到该数据库下执行后续操作。 ```sql CREATE DATABASE mysqltestdb; USE mysqltestdb; ``` #### 表结构设计与定义 假设存在两个表:一个是存储部门信息的 `departments` 表;另一个是员工信息的 `employees` 表。这里希望确保每位员工都属于某个已存在的部门,这可以通过在上施加约束来实现。 ##### 部门表 (Departments) ```sql CREATE TABLE departments ( dept_id INT NOT NULL AUTO_INCREMENT, name VARCHAR(100), PRIMARY KEY(dept_id) ); ``` ##### 员工表 (Employees),带有指向 Departments 的 ```sql CREATE TABLE employees ( emp_id INT NOT NULL AUTO_INCREMENT, first_name VARCHAR(50), last_name VARCHAR(50), department_id INT, -- 这是一个字段 PRIMARY KEY(emp_id), FOREIGN KEY (department_id) REFERENCES departments(dept_id) ON DELETE CASCADE ); ``` 上述 SQL 语句中的 `FOREIGN KEY` 子句指定了 `employees.department_id` 是一个参照于 `departments.dept_id` 列的[^1]。当删除父记录时(即某部门),所有关联子记录也会被自动清除 (`ON DELETE CASCADE`)。 #### 控制约束的状态 有时出于性能考虑或其他原因,可能需要临时禁用或重新激活这些约束: - **关闭检查** ```sql SET foreign_key_checks = 0; ``` - **恢复检查** ```sql SET foreign_key_checks = 1; ``` 通常,在批量导入数据期间会暂时停用此功能以提高效率,之后再恢复正常状态[^2]。 #### 实际应用场景下的注意事项 虽然有助于维护关系型数据库的数据完整性,但也并非总是必要的。特别是在高并发写入场景或是分布式环境中,可能会带来额开销甚至成为瓶颈所在。因此,实际项目开发过程中应权衡利弊后再做决定[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值