关于mysql中外键关联的一些个人理解

在我看来hibernate最麻烦的一件事就是配置外键关联,稍微不慎就会出现配置错误的情况,现在的项目全部都是在使用mybaits,而mybaits使用就简单的多,起码虽然说是要自己写mysql语句,但是起码这种做法在现阶段的项目开发中还是非常的流行,以前经常听到眼言论说用hibernate开发会比mybaits要来得快,其实那应该 是对于高手而言,但是绝大部分如我这群菜逼而言,老老实实的写sql语句会更好一点,废话不多说,今天主要是谈谈外键关联对在项目开发中的影响。

表的关联,在某种程度上来说只是一种逻辑概念,比如在我们开始项目之初,是需要进行表设计,在用diagram  designe这类工具r设计表的时候,难免不会有各重业务上的逻辑关联的,这个时候如果你不使用外键管理,是很容易造成自身的逻辑混乱的,如果有那么一根根线连着,我们就能追根溯本,搞清整个项目的流程结构。

但是在物理结构的表上面,我们没必要进行物理上的硬绑定,而我们期望的关联,其实只是数据上存在的联系,而这种联系更多的是存在我们脑海里,而非明面上,所以在进行业务代码实现的时候,我们编写程序的时候,只需要在程序中实现逻辑关连 的存取即可,但是如果我们非得加上什么外键关联这层关系,只会带来更多的资源消耗来进行所谓的一致性检验,数据完整性检验,其实有些时候我们并不需要这层检验和约束。

我抽空问了几个其他公司的朋友,在mysql的时候,很多地方都直接把外键跟直接删除,当然这些都是互联网公司,因为相对于业务逻辑和速度,数据的完整性显得并不那么重要,各种的锁表估计也是追求性能的我们所不能接受的,若是遇到各种高并发和大流量的情况,外键造成的死锁和事务回滚那直接只会让程序猿骂娘。

当然在比如说银行或者是各种erp系统里面,数据完整性比企业的命还重要的时候,通过程序去控制各种业务逻辑显得并不那么可靠,因为程序总是那么容易攻破,而数据库稍微要更难一点点,而且在银行这种企业里面,数据是绝不能够轻易删除,而非向我们这样,如果哪些数据不尽人意,直接物理层面的给删除掉。

时间: 2024-10-17 03:12:46

关于mysql中外键关联的一些个人理解的相关文章

MySQL外键关联(创世纪新篇)

数据库外键 01.mysql> show create table country\G  02.*************************** 1. row ***************************  03.       Table: country  04.Create Table: CREATE TABLE `country` (  05.  `country_id` smallint(5) unsigned NOT NULL auto_increment,  06. 

django中外键关联表的查询随笔

django中,如果一个数据库中的表之间有外键的话可以方便的通过一个表查询到其相关表的数据.如有下面三个model:class Blog(models.Model):    name = models.CharField(max_length=100)    tagline = models.TextField() def __unicode__(self):        return self.name class Author(models.Model):    name = models

mysql中外键的一些基本操作

1 带外键的两个表,当插入记录的时候必须先在父表中插入记录,然后在子表中插入记录 2 父表 3 mysql> create table provinces( 4 -> id smallint unsigned primary key auto_increment, 5 -> pname varchar(30) not null 6 -> ); 7 8 查看数据表引擎 9 mysql> show create table provinces; 10 +-----------+-

mysql中外键的创建与删除

外键的创建 方法1:创建表的时候设置(外键名随机生成) 1.前提条件,必须要有一个主表,这里设为persons 2.主表中必须设置主键字段primary key,这里设为id_p //创建数据库database(test) create database if not exists test character set utf8; //创建主表(persons) create table if not exists persons( id_p int not null, lastName var

Mysql中外键的 Cascade ,NO ACTION ,Restrict ,SET NULL

如果在父表中找不到候选键,则不允许在子表上进行insert/update 外键约束对父表的含义: 在父表上进行update/delete以更新或删除在子表中有一条或多条对应匹配行的候选键时,父表的行为取决于:在定义子表的外键时指定的on update/on delete子句, InnoDB支持5种方式, 分列如下 1 . cascade方式 在父表上update/delete记录时,同步update/delete掉子表的匹配记录 On delete cascade从mysql3.23.50开始可

Mysql 外键设置

MySql外键设置详解 (1) 外键的使用: 外键的作用,主要有两个:    一个是让数据库自己通过外键来保证数据的完整性和一致性    一个就是能够增加ER图的可读性    有些人认为外键的建立会给开发时操作数据库带来很大的麻烦.因为数据库有时候会由于没有通过外键的检测而使得开发人员删除,插入操作失败.他们觉得这样很麻烦其实这正式外键在强制你保证数据的完整性和一致性.这是好事儿.    例如:    有一个基础数据表,用来记录商品的所有信息.其他表都保存商品ID.查询时需要连表来查询商品的名称

mysql外键(FOREIGNKEY)介绍及使用注意事项

一.基本概念 1.MySQL中"键"和"索引"的定义相同,所以外键和主键一样也是索引的一种.不同的是MySQL会自动为所有表的主键进行索引,但是外键字段必须由用户进行明确的索引.用于外键关系的字段必须在所有的参照表中进行明确地索引,InnoDB不能自动地创建索引. 2.外键可以是一对一的,一个表的记录只能与另一个表的一条记录连接,或者是一对多的,一个表的记录与另一个表的多条记录连接. 3.如果需要更好的性能,并且不需要完整性检查,可以选择使用MyISAM表类型,如果

mysql外键引发的锁等待

有这样两条sql: insert table_a (bId) value(1); -- sql-1  update table_b set b.xx=123 where b.id =1; -- sql-2 其中,table_a的字段bId是个外键:外键关联的正是table_b的id字段. 在mysql上执行这两条数据时,sql-1会锁住sql-2.我们的系统中,为这一个锁,发生了不知道多少的锁等待,更引发了不知道多少的死锁. 特此备忘.

mysql外键实战

一.基本概念 1.MySQL中“键”和“索引”的定义相同,所以外键和主键一样也是索引的一种.不同的是MySQL会自动为所有表的主键进行索引,但是外键字段必须由用户 进行明确的索引.用于外键关系的字段必须在所有的参照表中进行明确地索引,InnoDB不能自动地创建索引. 2.外键可以是一对一的,一个表的记录只能与另一个表的一条记录连接,或者是一对多的,一个表的记录与另一个表的多条记录连接. 3.如果需要更好的性能,并且不需要完整性检查,可以选择使用MyISAM表类型,如果想要在MySQL中根据参照完