灵活运用数据库主外键

灵活运用数据库主外键

 在最近的工作中发现,公司现有表都是没有主外键关系的,也就是没有加数据库主外键约束,全部都是采用程序来控制数据的一致性。这点让我很是不解,从当初学习数据库,到参加工作使用数据库和设计数据库,一直都遵循数据库的三范式,表之间的关联采用数据库的主外键约束(请理解这是数据库的约束,而不是我们程序控制的约束)。于是查找了一些资料,现在的疑惑才慢慢解开。下面我将对数据库的作用,以及为什么出现应用程序,再到真正开发时如何设计数据库的一些理解和大家分享下,欢迎提出不同的见解。

  数据库是什么

  数据库,是计算机中运行的一个进程,它可以完成数据存储,查找,分析,数据挖掘等我们通常使用的功能(大家可以联想access数据库),只是其操作起来对人员的要求较高,必须要懂得sql语句的写法,深刻理解表之间的关系,当然也可以请专门的人员来帮忙将数据导出来,这样的工作实施起来麻烦还是比较大的。并不是每个人都懂sql语法,专门的人员(DBA)一般公司请不起,简单的操作人员,工作效率是个问题。数据库的功能是强大,但是面向的人群较为苛刻。所以在我的思维习惯中,数据库往往是一种后台的服务(不直接操作它,但是使用其提供的服务,sql语句就是它提供的接口),不过现在不能再这么认为了,我们可以仅仅利用数据库各种数据的操作,比如数据的录入,数据的分析等,但是这样的效率太低了,如果每天有上千条的数据(这里说少点)需要保持,那么单纯来使用数据库这将是一项浩大的工程,分析也一样,而且分析得出的数据用户不一定能看懂。于是有了我们的应用程序。

  数据库之上的应用系统

  如果单从数据库应用程序的角度来考虑,而不谈其它应用系统,其作用可以为我们提供一个透明的简单的数据录入,查询和分析。用户只需要点击某一个按钮就可以得到想要的结果。而且其面向的人群更大众化,正是有这样的特性,才使计算机真正的为更多人服务,用户完全可以认为不存在数据库,无论是网上购物,还是自己的数据备忘,抑或是分析最近关注信息的走势,都是一个按钮解决问题。再回到技术上,系统要想做到方便用户使用,到底应该怎么做?

  需要知道的两个概念

  OLAP和OLTP。一个是联机分析处理,一个是联机事务处理。联机分析强调的是数据查询和整合分析,数据修改较少,而联机事务则强调数据修改较多,对数据一致性要求较高。这就对应着两个系统,一个系统对查询的性能要求很高,方便数据的可移植,一个系统对数据完整性和一致性要求较高。因此我们在做系统设计时必须搞清楚系统的特性,如果是查询性能高而且数据结构的修改较多,数据移植频繁,那么在数据库的设计时就不能完全遵循三范式,因为这样数据库会有一定的自检策略而且比较豪性能,相反则更能很好的保证数据的正确性。

  结论

  知识还是要灵活运用的,范式在数据库中是真理,但是当和其它系统集成的时候就不一定完全合理,比如数据的冗余,如果经常做统计查询,那么将统计结果放到一张表中比关联几张表来查询快多了,而且用户看中的就是这个,其它让我们大胆相信自己的程序能够控制后,做好数据准确的把门将军。让数据库的最后一道关用在其它地方吧。

====================================分割线================================

最新内容请见作者的GitHub页:http://qaseven.github.io/

时间: 2024-09-21 18:00:43

灵活运用数据库主外键的相关文章

一致性-在数据库中已有表数据的外键的建立问题

问题描述 在数据库中已有表数据的外键的建立问题 我的数据库中的表都有上万条的数据,考虑到表之间的数据一致性,需要用到外键,但是现在对表进行外键创建的时候报错了:"消息 547,级别 16,状态 0,第 2 行 ALTER TABLE 语句与 FOREIGN KEY 约束"FK_TM_ProT"冲突.该冲突发生于数据库"Master",表"dbo.TProD", column 'ID'." 这个ID列示该表的主键+唯一建,现在想

C# 数据库dataGridView刷新数据和主外键判断

本文主要讲诉在使用VS2012+SQL Server数据库做系统中,通常会遇到几个问题.使用dataGridView控件在修改.删除.插入数据后,怎样刷新数据显示操作后的结果.同时在对数据操作时通常会判断数据的主键是否存在或重复,判断外键是否重复,这几个问题我推荐使用函数的形式完成,同时推荐一个操作格式,下面将详细介绍. 一.dataGridView刷新数据 如下图所示,在数据库中删除一个数据或插入一个数据,我们都希望能够在左边的dataGridView控件中显示操作后的内容,而使用dataGr

跪求大虾。 解决小问题。 关于一个主外键修改问题。。

问题描述 我想修改主表中的一个字段.也就是外键.我实现的SQL语句是这样的updateCardsetCardTypeId=@CardTypeId,CardNo=@cardNo,CardPassword=@CardPassword,CardDesc=@CardDesc,CardState=@CardStatewhereCardId=@cardIdi=DBHelper.ExecuteCommand(sql,newSqlParameter("@CardTypeId",card.CardTyp

数据库主键,外键,关系,级联保存、更新、删除

数据|数据库 --建立数据库create database test;go --建立表customerscreate table customers(id int identity(1,1) not null,name varchar(15),age int,primary key(id));go --建立表orderscreate table orders(id int identity(1,1) not null,order_number varchar(15),price money,cu

小议sqlserver数据库主键选取策略_MsSql

因为主键可以唯一标识某一行记录,所以可以确保执行数据更新.删除的时候不会出现张冠李戴的错误.当然,其它字段可以辅助我们在执行这些操作时消除共享冲突,不过就不在这里讨论了.主键除了上述作用外,常常与外键构成参照完整性约束,防止出现数据不一致.所以数据库在设计时,主键起到了很重要的作用. 常见的数据库主键选取方式有: 自动增长字段 手动增长字段 UniqueIdentifier "COMB(Combine)"类型 一.自动增长型字段 很多数据库设计者喜欢使用自动增长型字段,因为它使用简单.

数据库主码被设为外码

问题描述 数据库主码被设为外码 数据库中外码是非码属性,因此可取值为空值或对应参照表的主码值,而我在数据库系统导论这本书中看到一段代码将sno , cno设置为主码,但又将sno,cno设为外码,那岂不是会存在主码取空值的可能?该怎么理解?如图.... 解决方案 不矛盾.此时,sno和cno组成了联合主码,而作为sno和cno单个非码属性可以作为外码,引用参照表. 解决方案二: 一个表的一个字段可以同时是主键和外键.最简单的,比如一个分类表: id parentid name 这里完全可以让id

实现删除主表数据时, 判断与之关联的外键表是否有数据

问题描述:某个基础信息表,与系统中30多个表存在外键关系,当删除基础数据时,需要判断是否已经被用过,如果用过则更改标志位,如果没有用过则直接删除,如何能很好实现这个处理?最好能够自动适应表的变化 问题解决(SQL Server 2005)-- SQL Server 2005的错误处理容易控制, 因此, SQL Server 2005中可以直接删除, 通过错误处理来确定是否需要更新. -- 示例如下.USE tempdbGO CREATE TABLE m(    id int PRIMARY KE

.Net中删除数据前进行外键冲突检测

数据 在编写数据库系统中为了保证系统中数据的一致性最简便且安全的方法就是在DBMS中建立外键约束,但删除主键数据时如果违反了外键约束,尽管DBMS会给出错误提示,如SQL Server的提示信息"%1! 语句与 %2! %3! 约束 '%4!' 冲突.该冲突发生于数据库 '%6!',表 '%8!'%10!%11!%13!.",但这些提示信息对最终用户来说,是不友好的,于是就自己写了个类,用来删除记录时的进行外键冲突检测,代码如下: using System;using System.D

数据库主键设计之思考

主键的必要性: 有些朋友可能不提倡数据库表必须要主键,但在我的思考中,觉得每个表都应该具有主键,不管是单主键还是双主键,主键的存在就代表着表结构的完整性,表的记录必须得有唯一区分的字段,主键主要是用于其他表的外键关联,本记录的修改与删除,当我们没有主键时,这些操作会变的非常麻烦. 主键的无意义性: 我强调主键不应该具有实际的意义,这可能对于一些朋友来说不太认同,比如订单表吧,会有"订单编号"字段,而这个字段呢在业务实际中本身就是应该具有唯一性,具有唯一标识记录的功能,但我是不推荐采用订