SqlServer数据库外键的困惑

在设计数据库和备份数据的时候是否使用外键一直很纠结。先说一下外键的优缺点吧

优点:保证数据的完整性和一致性和可靠性,能做到一次修改所有使用外键的数据对应的信息都改变的作用

缺点:数据表增多,增加开发难度。降低(Insert、Update、Delete)速度

取代外键的方法:触发器、程序

订单一般是我们设计最多的数据了。下面以订单举个类子

订单一般会有客户、订单状态、产品、供应商等信息。

这些属性都有外键以及各自的描述信息,如果订单上只存在有这些信息的外键。会有以下几个问题。

1. 查询/新增/修改/删除信息的时候需要涉及这些属性对应的表

2. 做记录备份的时候需要将对应的描述信息也进行备份。

这样在做订单的操作的时候性能就会相对比较慢。

在做订单备份的时候是否有必要备份这些外键属性。因为备份了意义不是很大,因为属性信息修改了,记录的描述信息是不能修改的。这样查询出来的描述应该怎么处理,都是需要考虑的问题。但作为检索条件,我们只能取用最新的属性记录,根据Key去检索。或者作为历史记录我们是否应该用key值去检索。感觉客户的需求才是决定设计的关键。

原文地址:https://www.cnblogs.com/feng-ye1192/p/SQL_FOREIGN_KEY.html

时间: 2024-10-31 09:06:59

SqlServer数据库外键的困惑的相关文章

开源进销存PSI - 数据库外键

今天在PSI的QQ群中聊起了数据库外键的话题,我就写这篇博文,说说我对数据库外键的一些考虑. 1.数据库设计中应该使用外键. 2.很杯具,PSI的数据库设计到目前为止,没有使用外键. 3.PSI会逐步把数据库外键给补上. 4.有些地方还真没法加上外键.举现在的例子: 4.1 t_warehouse_org中的org_id字段,即可以存储 t_org的id,又可以存储t_user的id,这个时候,外键就没法加了. 4.2 t_inventory_detail中的ref_number字段,可以存储多

[转载]数据库外键的使用

[转载]数据库外键的使用 外键的作用: 保持数据一致性,完整性,主要目的是控制存储在外键表中的数据. 使两张表形成关联,外键只能引用外表中的列的值! 例如: a b 两个表 a表中存有客户号,客户名称 b表中存有每个客户的订单 有了外键后 你只能在确信b 表中没有客户x的订单后,才可以在a表中删除客户x 建立外键的前提: 本表的列必须与外键类型相同(外键必须是外表主键). 指定主键关键字: foreign key(列名) 引用外键关键字: references <外键表名>(外键列名) 事件触

第二百八十节,MySQL数据库-外键链表之一对多

MySQL数据库-外键链表之一对多 外键链表之一对多 外键链表:就是a表通过外键连接b表的主键,建立链表关系 一对多:就是b表的某一个字段值对应a表外键里的多个值,前提是a表要与b表链表

SSH框架之Hibernate数据库外键如何插入值的问题

SSH框架之Hibernate数据库外键如何插入值的问题 一.目标: 现有表: 其中Tea_id属于外键,如何向含有外键的表中插入对应的数据. 二.pojos部分 Course_information .java package com.pojos; import java.util.Date; public class Course_information { private Integer Course_id; private String Course_name; private Inte

数据库 SQLserver 主外键 子查询

use lianxigo--创建部门表create table bumen ( bmcode int primary key,  --部门编号  bmname varchar(20),  --部门名字 bmceo varchar(20),  --部门主管 bmtel varchar(20),  --部门电话)go--创建人员表create table renyuan( code int primary key identity(1001,1),  --员工编号 name varchar (20)

数据库外键的使用

外键的作用: 保持数据一致性,完整性,主要目的是控制存储在外键表中的数据. 使两张表形成关联,外键只能引用外表中的列的值! 例如: a b 两个表 a表中存有客户号,客户名称 b表中存有每个客户的订单 有了外键后 你只能在确信b 表中没有客户x的订单后,才可以在a表中删除客户x 建立外键的前提: 本表的列必须与外键类型相同(外键必须是外表主键). 指定主键关键字: foreign key(列名) 引用外键关键字: references <外键表名>(外键列名) 事件触发限制: on delet

数据库外键使用

数据库到底用不用外键.触发器.索引.视图.存储过程 收藏 今天听了一个企业技术总监的宣讲,结果听说在他开发系统的过程中,都没有用到外键,这让我很惊讶,赶紧上网搜索了一些资料看了看,终于明白了不用外键的原因. 这是一篇关于是否使用外键的讨论,讲的很有道理: 对于主/外键/索引来说,在一些开发团队中被认为是处理数据库关系的利器,也被某些开发团队认为是处理某些具体业务的魔鬼,您的观点呢?在实际应用中您会采取哪种方式? 大家共同观点:主键和索引是不可少的,不仅可以优化数据检索速度,开发人员还省不其它的工

深刻理解数据库外键含义

上课的时候老师讲的很清楚,但是毕竟没有实际操作数据库,思考和实践真的完全是不同层次的. 我的读者表里面全是学生这一类,外键约束使得学生这一类别在类别表中无法删除,就是因为读者表中的学生这一类在约束,试想没有学生这一类,那么读者表里面的学生类别怎么办呢?所以必须得先把读者表里面的学生全删没了,才能从类别表中去掉学生这一类.

jango 模型管理数据model,数据库外键主键与一对一,一对多,多对多关系

四.models.py 定义和管理模型: 4.1模型class的属性就映射与数据库的字段参数 继承models.Model class TestClass(models.Model): 4.2在数据库生成数据表: #django默认在makemigrations会为表对象创建主键id,id = models.AutoField(primary_key=True) 你也可以自定义一个主键对象: 4.2.1: 生成迁移文件python manage.py makemigrations 4.2.2执行