开发者们应该知道,使用那些非标准的SQL命令(比如Oracle、微软和MySQL等数据库系统)存在程度相当高的危险。也就是说,从跨平台和遵守标准的角度出发,你应该尽量采用ANSI SQL,它是一种和平台无关的数据库语言。不管你在使用哪种数据库系统,如果它完全支持SQL那么它就应该支持ANSI SQL-92标准。可是,“应该支持”和“确实支持”完全是两码事。在进行DBMS跨平台编程的时候,并不是所有的系统都完全支持ANSI SQL标准。这篇文章主旨就是提出使用非标准SQL时所存在的风险及其相关的建议。

别使用存储过程

在某些编程环境下,出于效率和安全等方面的原因,存储过程成为程序员开发数据库应用程序的唯一方法。Visual Basic、C和Java程序员都并不需要了解SQL。然而,在其他某些编程环境下,存储过程又是完全禁用的。MySQL通常和Apache Web服务器组合使用,这是因为这两种软件不仅免费、可靠而且功能强大,但是,恰恰是MySQL不支持存储过程。

--------------------------------------------------------------------------------

存储过程的定义 
所谓存储过程就是组成一个逻辑单元而且执行特别任务的一组SQL语句。存储过程用来封装针对数据库服务器的一整套操作或查询。

--------------------------------------------------------------------------------

Oracle和SQL服务器两者都包括了“内建”的存储过程,其使用也是很方便的。可是,如果明智的话千万别指望它们,你无法保证数据库管理员是否锁定、删除或修改了这些存储过程。如果你发现可用的某些存储过程正是你需要的,你这才可以在自己的代码中使用它们的功能。

通常,你能在Oracle或SQL Server上使用存储过程但在MySQL上则无法利用。如果你确实用到了它们,那么你得保证自己没有用到同特定平台相关的命令(以后讨论)。

别使用连接
连接是Oracle和SQL Server 这两种DBMS上令人头痛的一个问题,因为这两种系统在连接的概念上有根本的不同。基本上,各个DBMS的连接工作原理不总是一样的,而且你最终可能会得到意外的结果集合。在我们谈论各个系统有关连接的概念差别以及如何解决这些问题之前,你应该理解基本的连接子句:

连接
Join(连接)是从多个数据源获取数据的SQL数据表创建命令。 
等连接
Equi-Join从两个独立的数据源获取数据并把它们组合成一个大表。 
内/外连接
内连接(Inner Join)把两个表的内部列连接起来。外连接把两个表的外部列连接起来。 
左/右连接
左连接(Left Join)连接两个表左边的列。右连接则连接两个表右边的列。 
复合/复杂连接
其他各种连接—左/内、左/外、右/内和右/外等。 
反正你得记清楚了,如果你想要自己的应用程序能在各种数据库服务器上都能工作那么就别使用连接。

ANSI SQL:CREATE, DROP, ADD, UPDATE, DELETE, INSERT, SELECT
总之,你应当用到的唯一命令如下:

数据定义语言(DDL)下的CREATE 和DROP。 
数据操作语言(DML)下的ADD、UPDATE、DELETE和INSERT 。 
获取数据的SELECT。 
如果你在这些命令中使用了区分大小写的表格或字段名,或者这些名字包含了空格或其它特殊字符,那么你最好用方括号把名字围起来。这样做有助于防止非标准字符引发DBMS的不正常反应。

引用的完整性:键和数据类型

使用关系数据库的决定性原因就是明确数据之间的关系而且维持那些关系的完整性。这样才能让开发者以最小的冗余性、最高效的方式存储数据。键定义了关系。数据类型定义了存储和操作数据的规则。这些就是一个数据库的基本方面,但是具体的语法却可能因为数据库的不同而不同。

数据类型
只有很少部分的数据类型得到所有数据库服务器的支持。每一种DBMS都有它自己的数据类型以及为什么要这样使用它们的原因。某些专有数据类型(比如Microsoft Access的AUTONUMBER)用起来确实相当方便。

以下是ANSI数据类型:
BIT, CHARACTER, DATE, DECIMAL, DOUBLE PRECISION, FLOAT, INTEGER, INTERVAL, NUMERIC, REAL, SMALLINT, TIMESTAMP, TIME, VARBIT, VARCHAR, CHAR

以下是Oracle/Access/SQL不支持的“标准”数据类型:
INTERVAL, TIME, VARBIT

只有Oracle才支持DATE,但是以下的“标准”数据类型不被Oracle支持:
BIT, DECIMAL, NUMERIC, TIMESTAMP

以下的“标准”数据类型不被Access支持:
BIT, CHARACTER, DATE, NUMERIC, SMALLINT, TIMESTAMP

这样,只有以下的数据类型可以保证在各类数据库上都能使用:
DOUBLE PRECISION, FLOAT, INTEGER, NUMERIC, REAL, SMALLINT, VARCHAR, CHAR

主/外键

假设某个表内有两个字段,创建这个表的语法如下: 
CREATE TABLE [MyTable] ([FieldA] VARCHAR, [FieldB] VARCHAR);

为了添加主键以便表内的每一条记录都唯一标识你可以采用PRIMARY KEY 表达式:
CREATE TABLE [MyTableA] ([RecordID] VARCHAR PRIMARY KEY, [FieldA] VARCHAR, [FieldB] VARCHAR);

在创建另一个表,其中一个字段索引第1个表,你可以把该字段定义为同第1个表的字段具有关系的外键:

CREATE TABLE [MyTableB] ([RecordID] VARCHAR PRIMARY KEY, [FieldA] VARCHAR, [FieldB] VARCHAR, [FieldC] VARCHAR REFERENCES [MyTableA]([FieldA]))

在以上例子中,所有的字段都是VARCHAR类型;但是你得记住,某一数据类型字段只能索引同一数据类型的字段。

ODBC 和 JDBC
如果你在编写的应用程序要用到SQL数据库连接,那么你可以用ODBC完成该功能。如果它是一个Java应用程序则可以用JDBC(简而言之就是ODBC的Java接口)。

因为你希望自己的应用程序最好不要引起管理员的注意,所以你应该为你用户的DBMS包括所有必要的ODBC驱动程序。这样,如果用户从一个平台转移到另一个平台,它们所需要的驱动程序却已经事先拥有了。

你的应用程序应该通过编程的方式决定当前用到的ODBC驱动程序对应何种DBMS。这样你才能用上那些数据库服务器上强大的、同特定平台相关的命令。

另类浏览器之战 
最流行的浏览器当然是微软的Internet Explorer和Netscape的Navigator了。但是,不管你手头用的是哪一种,它能保证支持现有的所有网站吗?错!很多花哨的东西,比如DHTML、框架以及多媒体等等都各自受到两类浏览器中非标准的HTML标签的支持。

因为程序在这两种国际标准的岔路口无所适从,所以你必须为两种浏览器编写代码或者编写最具普遍性的功能代码而放弃大量的动态内容。

数据库服务器也面临同样的问题。ANSI SQL-92是人人赞同的标准。然而,Oracle、微软以及其他数据库厂商还自作主张加入了很多破坏SQL代码的特性。因此,你不仅得编写遵从基本规范(SQL-92)的代码,而且的代码还得根据具体用到的产品实现不同的特性。

在你自己的应用程序内,你必须正确地决定应用程序将使用什么类型的数据库,而且数据库应该定位在哪里。你还得老练地处理应用程序或用户产生的任何错误。你当然不希望仅仅因为文件被删除或者网线连接松弛就导致程序崩溃(或服务器崩溃)。在经过精心设计的网络上,数据库服务器通常同工作站和Web服务器、应用服务器在物理上相分离,因此断开连接是很常见的。

小结 
作为Web开发者,你需要对应用程序使用非标准SQL命令的危险保持高度的小心。这篇文章的中心思想是建议用ANSI SQL编写跨平台的应用程序。利用ANSI SQL减少商业数据库系统的非标准方言所带来的头疼问题。

转载于:https://www.cnblogs.com/wannaCNBLOGS/archive/2005/08/04/207066.html

数据库的跨平台设计(转)相关推荐

  1. 【数据库技术课程设计】 电信学院考研信息管理系统 +【Visual FoxPro】

    目录 一 .系统设计背景 二.系统可行性分析 2.1 经济可行性 2.2 技术可行性 2.3 操作可行性 2.4 可行性分析总结 三.软件选择与编程环境 3.1 软件选择 3.2 编程环境 四.系统总 ...

  2. 用Visio进行数据库建模、设计和实现

    用Visio进行数据库建模.设计和实现 摘要:Visio是微软著名的图形软件,功能强大.使用Visio完成绘图任务时能够显著地提高工作效率和质量.目前功能最全的Visio版本是VSEA(Visual ...

  3. 伤感网络验证系统_可验证云数据库架构与设计

    区块链的发展到了一个关键阶段.向左走,是一眼望不到尽头的公链和交易所.向右走,是一脸茫然的探寻:区块链如何和古典互联网行业相结合.就像文章<货币.区块链和社交扩展性>所阐述的根本原理,区块 ...

  4. 如何实现高容量大并发数据库服务 | 数据库分布式架构设计

    袋鼠学院和优云.阿里云联合举办的沙龙结束之后,总是有小伙伴们来问PPT内容,想要进一步了解Topic内容.(哦,对了对了,竟然还有小伙伴专门冲着袋鼠云去听沙龙,感动cry~~) 千呼万唤,忙成狗的袋鼠 ...

  5. 『数据库』怎样设计一个数据库

    数据库从入门到精通:戳我 数据库设计概念 数据库设计是指对于一个给定的应用环境,构造(设计)优化的数据库逻辑模式和物理结构, 并据此建立数据库及其应用系统,使之能够有效地存储和管理数据,满足各种用户的 ...

  6. 数据库有哪些设计技巧

    1. 原始单据与实体之间的关系 可以是一对一.一对多.多对多的关系.在一般情况下,它们是一对一的关系:即一张原始单据对应且只对应一个实体.在特殊情况下,它们可能是一对多或多对一的关系,即一张原始单证对 ...

  7. 数据库sql课程设计_SQL和数据库-初学者完整课程

    数据库sql课程设计 In this course, Mike Dane will teach you database management basics and SQL. 在本课程中,Mike D ...

  8. 夺命雷公狗ThinkPHP项目之----企业网站2之数据库的快速设计

    我们在一个项目的时候,花费最多事件的估计还是数据库的时间了,我们的数据库暂时就这样设计好了: 暂时我们的数据库就这样设计好了用下先,建好后如下所示: 转载于:https://www.cnblogs.c ...

  9. 数据库面试 - 如何设计才可以让系统从未分库分表动态切换到分库分表上?

    数据库面试 - 如何设计才可以让系统从未分库分表动态切换到分库分表上? 面试题 现在有一个未分库分表的系统,未来要分库分表,如何设计才可以让系统从未分库分表动态切换到分库分表上? 面试官心理分析 你看 ...

  10. 数据库面试 - 如何设计可以动态扩容缩容的分库分表方案?

    数据库面试 - 如何设计可以动态扩容缩容的分库分表方案? 面试题 如何设计可以动态扩容缩容的分库分表方案? 面试官心理分析 对于分库分表来说,主要是面对以下问题: 选择一个数据库中间件,调研.学习.测 ...

最新文章

  1. 脉冲神经网络(SNN)概述
  2. Shadow mapping
  3. webbench网络压力测试源码
  4. 宏定义与const的区别
  5. 安卓摄像头 data 转bitmap
  6. 移动物联网技术LoRa、SigFox、NB-IoT和eMTC的发展轨迹
  7. docker学习笔记(一)docker入门
  8. Web Deploy发布网站及常见问题解决方法(图文)
  9. 文献学习(part38)--Adaptive hash retrieval with kernel based similarity
  10. android imageview 图片切换动画,在Android中以动画方式将ImageView移动到不同的位置...
  11. java多线程思维导图
  12. maven springboot 除去指定的jar包_SpringBoot的运行机制
  13. VirtualBox 删掉虚拟镜像重新安装失败
  14. PHP中获取CHECKBOX提交的内容及checkbox全选
  15. 让你认识Android 开发简介及应用程序架构示例
  16. EJB到底是什么,真的那么神秘吗?
  17. 锁定计算机后qq能远程吗,如何通过QQ进行远程控制(利用QQ远程协助在不同网络下远程控制电脑)...
  18. f(f(x))=-x, 纯数学理解
  19. 浙江大学数据结构第一讲:1.1什么是数据结构
  20. 2021高考成绩已出城市查询,查分时间已公布!高考结束后别急着浪,这些填志愿技巧考生需知晓...

热门文章

  1. 在Idea2017.1中编译时发生如下的错误
  2. 电脑出现的问题以及解决方法
  3. css 动画类库Animate.css
  4. Scanner--控制台输入
  5. T-SQL语言(二)
  6. Beyond Compare使用记录
  7. vue学习日志-过滤器
  8. Vue学习笔记进阶篇——多元素及多组件过渡
  9. 网络语音视频技术浅议(附多个demo源码下载)
  10. Node.js入门(二)