我的观点是,外键在初始阶段能加的都加上,只有迫不得已的时候才disable或drop掉。遇到性能瓶颈的时候,尽量采用其它方式调优,而不要轻易牺牲掉外键。有外键约束的时候,写程序的确会有约束,但从直觉上说这种约束一定程度上揭示了设计或实现上不合理的地方。带着外键写出来的应用更倾向于严谨。产品上线之前如果确实需要通过牺牲外键达到性能上的优化,再捡相对不重要的外键废弃掉,同时要把这个document下来,下次遇到数据不一致问题的时候,是个线索。两点说明:1. 我们在做的一个项目确实是小项目。 2. 我得承认我最近三年开发都不用关系型数据库,貌似 no sql那么nb的key-value pair存数据,其实这三年在持久层上很多纠结。如果我说的不对,请指正!
下面引用一些有见地的想法:
× 支持外键的:
1. 你的程序再严谨也有可能出现BUG;你自己判断不如交给数据库判断,它做得又快又好。
大多数人的程序没有考虑并发问题。一旦考虑了就得手工加锁,效率很低。
数据可能绕过你的应用程序进入数据库。
2. 性能问题:难道你自己做就没有开销?
一个外键判断分摊到事务级别,开销可以忽略,用户完全没有察觉。
如果是批量导入数据,可以先暂时屏蔽外键,事后用NOVALIDATE选项快速恢复,前提是你的数据是干净的。
也有人提到了如果100张表可能需要建立300个约束,导致性能太差。
我要说的仍然是,是否这300个外键约束都是业务必须的,如果是,没有办法这就是必须要加的,如果不是,那么大可不必在所有的地方都增加外键。
如果在程序中仅对其中的5、6张表的10来个外键约束进行判断,然后和数据库中的300个外键去比较,并评价Oracle的外键性能太差,恐怕是有失公允的。
× 反对外键的:
的确外键在大系统中用的很少,在开发初级,设计数据库的时候一般会加入外键,以保证系统设计的完整性和业务需求的完整性,也便于开发人员了解业务规则,在程序中加以控制,很多大系统在系统稳定后,会逐步将外键去掉,以保证性能,将太多的功能强加于数据库,虽然说数据库很强大,但是毕竟很多人不信任数据库的能强大到什么都能干的地步。所以在一个大系统中外键见的少也不足为奇,小系统就无所谓了,用不用外键取决于设计人员,这样的系统也随处可见。
另引用一篇:
数据库设计是否需要外键。这里有两个问题:一个是如何保证数据库数据的完整性和一致性;二是第一条对性能的影响。
正方观点:
1,由数据库自身保证数据一致性,完整性,更可靠,因为程序很难100%保证数据的完整性,而用外键即使在数据库服务器当机或者出现其他问题的时候,也能够最大限度的保证数据的一致性和完整性。
eg:数据库和应用是一对多的关系,A应用会维护他那部分数据的完整性,系统一变大时,增加了B应用,A和B两个应用也许是不同的开发团队来做的。他们如何协调保证数据的完整性,而且一年以后如果又增加了C应用呢?
2,有主外键的数据库设计可以增加ER图的可读性,这点在数据库设计时非常重要。
3,外键在一定程度上说明的业务逻辑,会使设计周到具体全面。
反方观点:
1,可以用触发器或应用程序保证数据的完整性
2,过分强调或者说使用主键/外键会平添开发难度,导致表过多等问题
3,不用外键时数据管理简单,操作方便,性能高(导入导出等操作,在insert, update, delete 数据的时候更快)
eg:在海量的数据库中想都不要去想外键,试想,一个程序每天要insert数百万条记录,当存在外键约束的时候,每次要去扫描此记录是否合格,一般还不止一个字段有外键,这样扫描的数量是成级数的增长!我的一个程序入库在3个小时做完,如果加上外键,需要28个小时!
结论:
1,在大型系统中(性能要求不高,安全要求高),使用外键;在大型系统中(性能要求高,安全自己控制),不用外键;小系统随便,最好用外键。
2,用外键要适当,不能过分追求
3,不用外键而用程序控制数据一致性和完整性时,应该写一层来保证,然后个个应用通过这个层来访问数据库。
分享到:
相关推荐
3. **数据库完整性**:实体完整性要求每个表的主键不能为空,参照完整性确保了表间引用的正确性,即外键必须指向存在的主键。用户定义的完整性可以设定特定的约束条件,比如唯一性约束。在本例中,`Student`表的`Sno...
数据库实验是学习数据库管理和操作的重要实践环节,它涵盖了多种...每个实验项目都应有明确的目标,逐步引导学习者掌握数据库的核心概念和技术。在实践中,我们还能遇到并解决实际问题,从而加深对数据库系统的理解。
数据库表是数据存储的主要实体,每个表应有明确的业务含义,字段设计要遵循最小冗余原则,以防止数据不一致。 3.2. 数据库列 列的设计应考虑数据类型、长度、是否允许空值等因素,确保数据的有效性和存储效率。例如...
问题3则涉及ER图的错误分析,指出外部实体间不应有数据流,外部实体与数据存储间也不应有直接的数据流,加工过程的输入和输出数据流应有明确区分,且加工过程应有输入和输出。 **试题二**: 这部分主要测试SQL语言...
"或"PRC_"开头,函数以"F_"或"FUN_"开头,包以"PKG_"开头,触发器以"TR_"开头,索引以"IDX_"开头,唯一索引以"UNI_"开头,主键以"PK_"开头,外键以"FK_"开头,Sequence以"SEQ_"开头,同义词与原对象同名,数据库连接...
6. **自动单据号**:录入单据的表应有“自动单据号”,作为主表的主键,由系统自动生成,不可用户修改,同时也是连接主表和明细表的外键。 7. **明细表**:明细表应设置序号列,以便在单据中排列行。 8. **业务...
- **约束**:添加各种类型的约束以保证数据完整性,如非空、唯一、主键和外键。 - **注释**:每个表和字段应有中文注释,以提高可读性。 - **索引**:根据数据特点选择合适的索引类型,如B-TREE、位图索引等,并...
2. 关系数据库特性:正确的关系表不应有重复行(即任意两行的值不能相同)且列的顺序无关紧要,但并未强调列值不能相同,这是对关系特性的误解。 3. 数据库控制:并发控制是防止多用户同时操作同一数据导致的问题,...
每个实体都应有明确的主键,并通过外键关联其他表,形成完整的数据模型。 2. **关系数据库管理系统(RDBMS)**:RPG常用的数据库系统包括MySQL、PostgreSQL、SQLite等,它们支持SQL语言,能高效地处理大量数据,...
- 主外键设计时,创建外键约束,确保键的唯一性,避免复合键,外键应关联唯一键。 **第3章 使用规范** 3.1 **综合** - 只有数据库管理员能修改数据库结构,其他人需提交修改申请。 - 数据访问层推荐使用存储过程,...
1. 主键索引:每个表都应有主键,且主键字段自动创建唯一索引,以保证数据的唯一性和提高查询效率。 2. 外键索引:为了加快关联查询速度,外键字段也应建立索引。 3. 常用查询字段索引:对于频繁用于查询的字段,如...
每个表应有明确的结构,包括主键(唯一标识记录)、外键(与其他表关联)和其他字段,以维护数据的完整性和一致性。 - 使用企业管理器创建表,并设置各种完整性约束,如非空约束、唯一约束、外键约束等,以确保数据...
2. **索引选择**:对于每个可优化的子句,优化器都会检查数据库系统表,以确定是否有相关的索引可用于访问数据。只有当索引中的列的前缀与查询子句中的列完全匹配时,该索引才能被认为是有效的。 #### 结论 综上所...
易买网数据库设计是一个关于构建在线购物平台数据库的实例,旨在教授如何在MySQL数据库中有效地设计和规划项目。这个数据库模型对于理解电子商务系统的数据结构及其关系具有很高的学习价值。通过分析`easybuy.sql`...
1. **实体设计**:例如,会员实体(Customer)、课程实体(Course)、预约实体(Reservation)、器材实体(Equipment)等,每个实体应有其对应的属性(字段)。 2. **关系设计**:会员可能报名多个课程,课程可以被...
4. **表设计**:在TS_系统数据库模版中,每个表应有明确的业务含义,字段应精简且有意义,避免冗余数据。主键是每个表的唯一标识,通常由一个或多个字段组成,确保行的唯一性。外键用于建立表之间的关联,维护数据的...
表结构应包含主键和外键以确保数据的一致性和完整性。此外,还需要考虑数据库的性能优化,例如合理设置索引,以支持高效的查询操作。 其次,我们关注VB编程。VB是一种事件驱动的编程语言,特别适合开发用户界面友好...
2. 外键:禁止数据库表间的主外键关联,依赖应用程序来维护数据完整性和一致性,特殊情况除外。 3. 命名规则:表名前缀表示业务模块,字段名采用下划线分隔,便于理解。 4. 公共字段:每张表应包含创建时间和更新...
1. 数据库结构转换:工具首先分析MySQL的表结构,包括字段名、字段类型、键约束(主键、外键等)、索引等,然后在SQL Server中创建相应的表结构。 2. 数据迁移:将MySQL中的记录逐条读取并写入到SQL Server中,确保...