数据库设计之外键的思考

标签: 数据库 设计 外键 | 发表时间:2014-09-24 03:51 | 作者:guogang83
出处:http://blog.csdn.net

    关于是否使用外键在业界也没有统一的标准,大家争论的焦点是数据一致性和性能上。

    支持使用外键方,强调如果不使用外键,数据一致性无法保证,性能消耗可以忽略。

    反对使用外键方,数据一致性可以通过程序保证,性能有大问题,数据维护很麻烦,如果是大系统,整个外键的关系就像编制的一张大网。再者开发人员很难真正用好外键。

    其实两种观点我都支持,现状是我基本没用过外键。没使用外键会出现什么问题呢?

    1.数据一致性无法保证。出现这种情况最多的情况是,如A表示基础表,它被很多模块引用,B表是业务表,A表中删除了数据,B表的数据关联A的信息没有删除,导致写SQL时会出现大量的外连接。

    2.从表上没有建索引。如果从表上有外键,这种情况悲剧就要发生了。请看参考我之前写的  外键不加索引引起的性能问题

    3.使用外键在后台修改数据非常麻烦,当然这个不是外键的问题,只是系统自身的问题。

   你看任何一本涉及到数据库设计的书籍,都会告诉你一定要使用外键,但理想和实现总是有点差距,如何选择,我的建议:

    1.如果你对数据一致性要求非常高,关乎人命,钱,一定要加外键,像财务系统等。反之,可以牺牲一下,换取方便。

    2.如果不加外键,基础的表(就是会被引用的表)要做逻辑删除(加一个删除的标识位),可以避免大量的外连接。

    3.不管是否加外键,一定要索引。

作者:guogang83 发表于2014-9-23 19:51:39 原文链接
阅读:88 评论:0 查看评论

相关 [数据库 设计 外键] 推荐:

数据库设计之外键的思考

- - CSDN博客数据库推荐文章
    关于是否使用外键在业界也没有统一的标准,大家争论的焦点是数据一致性和性能上.     支持使用外键方,强调如果不使用外键,数据一致性无法保证,性能消耗可以忽略.     反对使用外键方,数据一致性可以通过程序保证,性能有大问题,数据维护很麻烦,如果是大系统,整个外键的关系就像编制的一张大网.

数据库设计规范

- - SQL - 编程语言 - ITeye博客
数据库表的命名以是名词的复数形式且都为小写,如cities, categories, friends等等. 如果表名由几个单词组成,则单词间用下划线("_")分割,如subscribed_pois,poi_categories等. 表名尽量用全名,表名限制在30个字符内. 当表的全名超过30字符时,可用缩写来减少表名的长度,如description --> desc;information --> info;address --> addr等.

数据库设计的三大范式

- 文斌 - 博客园-首页原创精华区
为了建立冗余较小、结构合理的数据库,设计数据库时必须遵循一定的规则. 在关系型数据库中这种规则就称为范式. 范式是符合某一种设计要求的总结. 要想设计一个结构合理的关系型数据库,必须满足一定的范式. 在实际开发中最为常见的设计范式有三个:. 如果数据库表中的所有字段值都是不可分解的原子值,就说明该数据库表满足了第一范式.

数据库设计注意事项

- - CSDN博客推荐文章
           数据库设计包括:库的设计,表的设计,字段的设计,主键和外键的设计,索引设计,约束设计. 1、数据库名称要明确,可以加前缀或后缀的方式,使其看起来有业务含义,比如数据库名称可以为Business_DB(业务数据库). 2、在一个企业中,如果依赖很多产品,但是每个产品都使用同一套用户,那么应该将用户单独构建一个库,叫做企业用户中心.

数据库设计的最佳实践

- - CSDN博客数据库推荐文章
1、使用定义明确的表或列名,并保持一致(例如,School、StudentCourse、CourseID). 2、使用单数形式的表名(即,用StudentCourse而非StudentCourses). 表代表了实体的合集,不需要复数形式. 否则你将在定义表时不得不使用“{”、“[”等字符(即为了访问表Student Course,你须得书写“Student Course”.

SQLite数据库存储引擎设计

- - searchdatabase
  SQLite是一个嵌入式库并且实现了零配置、无服务端和事务功能的SQL数据库引擎. 它在广泛领域内被使用,而且单线程读写性能与MySQL比肩,并且保证ACID性.   SQLite的存储后端是采用Btree实现,多个连接可以并发操作,但是同一时间只允许一个写着存在.   SQLite在硬盘上一个数据库一个文件,每个数据库文件头部保存有这个数据库的元信息,包括版本,大小,Btree根节点位置等等.

ORACLE数据库优化设计方案

- - CSDN博客推荐文章
本文主要从大型数据库ORACLE环境四个不同级别的调整分析入手,分析ORACLE的系统结构和工作机理,从九个不同方面较全面地总结了ORACLE数据库的优化调整方案. 关键词 ORACLE数据库 环境调整 优化设计 方案. 对于ORACLE数据库的数据存取,主要有四个不同的调整级别,第一级调整是操作系统级包括硬件平台, 第二级调整是ORACLE RDBMS级的调整,.

进销存数据库表设计

- - 数据库 - ITeye博客
CREATE TABLE user /*用户表*/ (. CREATE TABLE Supplier /*供应商表*/ (. NOT NULL, /* 供应商编号 ,主键 */. NOT NULL, /* 供应商名称 */. NOT NULL, /* 地址 */. CREATE TABLE Customer /* 客户表*/ (.

Typecho的数据库设计的学习

- - 标点符
Typecho是一款仿Wordpress,但相对Wordpress要简单的多的开源博客程序. 开发者大量的参考了WordPress的设计,去除了一些高级复杂的功能,实现了一个小而美的博客系统. 轻量高效:仅仅 7 张数据表,加上不足 400KB 的代码,就实现了完整的插件与模板机制. 超低的 CPU 和内存使用率,足以发挥主机的最高性能.

数据库优化:mysql数据库单机数十亿数据查询设计

- - Seay's blog 网络安全博客
    很久没写文章,是不是想着写点什么东西,分享下我的数据库设计思路,主要是针对单机数十亿及以上数据查询优化技巧. 如果只是简单的查询,没有频繁的写入操作,对查询速度不要求在毫秒级别,就不需要什么大型的数据库软件设计复杂的集群关系,也不需要分布式水平分割等太重的优化. 只需要用mysql在本机笔记本搭建一个普通的环境就行.