1 | /** |
1 | /** |
1 | /** |
1. 须将axios 配置中的responseType
设置为’arraybuffer’,这样就不会让表格出现乱码现象;
2. 如果要动态设置文件名则需要让后台将名字设置到响应头中,否则将是一个乱码的文件名;
3. 然后通过<a></a>
标签的特性来,自动点击下载文件;
4. 如果要兼容IE则需要利用navigator.msSaveOrOpenBlob
方法;
5. 兼容Firefox 须将<a></a>
标签添加到body
中,最后再移除<a></a>
标签
1 | // axios config |
1 | const os = require('os'); |
Node 基于V8引擎,是一个 JavaScript 运行环境,可以让JavaScript开发后端程序,打破了JavaScript 只能在浏览器中运行的居局面,同时开发周期短、开发成本低、学习成本低。
V8 JavaScript引擎是由Google公司使用C++语言开发的一种高性能JavaScript引擎
在Java、PHP或者.NET等服务器语言中,会为每一个客户端连接创建一个新的线程。而每个线程需要耗费大约2MB内存,一个8GB内存的服务器可以同时连接的最大用户数为4000个左右。NodeJs仅使用一个线程,当有用户连接了,就触发一个内部事件,通过非阻塞I/O、事件驱动机制,,让Node.js程序宏观上也是并行的。使用Node.js,一个8GB内存的服务器,可以同时处理超过4万用户的连接。
Nodejs 的生态链非常的完整,有各种各样的功能库。可以根据自己的需要通过安装工具 NPM 快速安装
官网下载 node (https://nodejs.org/en/)
安装 socket.io1
2npm install socket.io
npm install node-static
socket.io特别适合用来开发WebRTC的信令服务器,通过它来构建信令服务器特别的简单,这主要是因为它内置了房间 的概念。
socket.io 分为服务端和客户端两部分。服务端由 Nodejs加载后侦听某个服务端口,客户端要想与服务端相连,首先要加载 socket.io 的客户端库,然后调用 io.connect();
就与服务端连上了。
1 | //给本次连接发消息 |
客户端 demo
1 |
|
1 | // socketIo.js |
服务端 demo
1 | /* socke.io 信令服务器 |
房间的创建与销毁、加入房间、离开房间、开启音频/关闭音频、开启视频/关闭、获取房间人数、静音/取消静音、切换主讲人、视频轮询、白板中的画笔、各种图型等等这些都是会话控制消息。
相对来说都是一些比较简单的消息。
网络信息消息用于两个客户端之间交换网络信息。
由于它是基于点对点连接的,自然而然需要NAT (Network Address Translator 网络地址转换)穿越的技术,否则消息将无法传递。
在WebRTC中使用 ICE 机制建立网络连接。
交互式连接创建是由 IETF 的 MMUSIC 工作组开发出来的一种framework,可集成各种NAT穿透技术,如STUN、TURN(Traversal Using Relay NAT,中继NAT实现的穿透)、RSIP(Realm Specific IP,特定域IP)等。该framework可以让SIP的客户端利用各种NAT穿透方式打穿远程的防火墙。
在计算机网络中是一种在IP数据包通过路由器或防火墙时重写来源IP地址或目的IP地址的技术。这种技术被普遍使用在有多台主机但只通过一个公有IP地址访问互联网的私有网络中。它是一个方便且得到了广泛应用的技术。当然,NAT也让主机之间的通信变得复杂,导致了通信效率的降低。
我们上网很可能会处在一个 NAT 设备(无线路由器之类)之后。NAT设备会在IP封包通过设备时修改源/目的IP地址. 对于家用路由器来说, 使用的是网络地址端口转换(NAPT), 它不仅改IP, 还修改TCP和UDP协议的端口号, 这样就能让内网中的设备共用同一个外网IP
国内移动无线网络运营商在链路上一段时间内没有数据通讯后, 会淘汰NAT表中的对应项, 造成链路中断,出现NAT超时。 国内的运营商一般NAT超时的时间为5分钟,所以通常我们TCP长连接的心跳设置的时间间隔为3-5分钟
STUN/RFC5389 是一种处理NAT传输的协议,但主要作为一个工具来服务于其他协议。
运行位于 NAT 后的客户端找出自己的公网地址,可以被终端用来发现其公网IP和端口。
同时可以检测端点间的连接性,也可以作为一种保活(keep-alive)协议来维持NAT的绑定。
这些信息被用在两个同时处在 NAT 路由器后的主机创建UDP通信。
一种数据传输协议,是STUN/RFC5389的一个拓展。允许在 TCP 或 UDP 的连线上在线跨域 NAT 或防火墙
为了保证通信能够建立,我们可以在没办法的情况下用保证成功的中继方法(Relaying), 虽然使用中继会对服务器负担加重,而且也算不上P2P,但是至少保证了最坏情况下信道的通畅,从而不至于受NAT类型的限制。
TURN/RFC5766就是为此目的而进行的拓展。
uni-app只支持vue单文件组件(.vue 组件)render,和<script type="text/x-template">
字符串模版等 非H5端都不支持
uni-app 支持配置全局组件,需在 main.js 里进行全局注册,注册后就可在所有页面里使用该组件。
表单控件推荐使用原生或uniapp生态库中的组件
非H5不支持v-html 跨端的富文本处理方案详情
非H5端不支持列表:
标准的 HTML 及 SVG 标签名不能作为组件名。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45a
canvas
cell
content
countdown
datepicker
div
element
embed
header
image
img
indicator
input
link
list
loading-indicator
loading
marquee
meta
refresh
richtext
script
scrollable
scroller
select
slider-neighbor
slider
slot
span
spinner
style
svg
switch
tabbar
tabheader
template
text
textarea
timepicker
trisition-group
trisition
video
view
web
当重复设置某些属性为相同的值时,不会同步到view层。每次将scroll-view组件的scroll-top属性值设置为0,只有第一次能顺利返回顶部。 这和props的单向数据流特性有关,组件内部scroll-top的实际值改动后,其绑定的属性并不会一同变化。
解决方法:
监听scroll事件,记录组件内部变化的值,在设置新值之前先设置为记录的当前值 (推荐使用)
1 | <scroll-view :scroll-top="scrollTop" scroll-y="true" @scroll="scroll"> |
监听scroll事件,获取组件内部变化的值,实时更新其绑定值
1 | export default { |
可在onLoad 里得到,onLoad 的参数是其他页面打开当前页面所传递的数据。
uni-app 内置了 vuex ,在app里的使用,可参考hello-uniapp store/index.js。
v-for="(item, index) in 10"
item 是从 1开始,其它平台从0开始v-for="(value, name, index) in object"
index 是不支持的1 | <view :class="{ active: isActive }">111</view> |
以 :style=””方式设置的px单位是不会被编译器转换1
2<view v-bind:style="{ color: activeColor, fontSize: fontSize + 'px' }">666</view>
<view v-bind:style="[{ color: activeColor, fontSize: fontSize + 'px' }]">777</view>
非H5端不支持 classObject
和styleObject
语法,同时不支持在自定义组件上使用class和style的绑定1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24<!-- 不支持的写法如下 -->
<template>
<view :class="[activeClass]" :style="[baseStyles,overridingStyles]"></view>
</template>
<script>
export default {
data() {
return {
activeClass: {
'active': true,
'text-danger': false
},
baseStyles: {
color: 'green',
fontSize: '30px'
},
overridingStyles: {
'font-weight': 'bold'
}
}
}
}
</script>
vue与uniapp对应的事件名称:
1 | // 事件映射表,左侧为 WEB 事件,右侧为 ``uni-app`` 对应事件 |
.stop
各平台全支持.prevent
仅H5.self
仅H5.once
仅H5.capture
仅H5.passive
仅H5禁止蒙版下的页面滚动可使用 @touchmove.stop.prevent=”handle”
无按键修饰符
]]>manifest.json
是应用的配置文件,用于指定应用的名称、图标、权限等属性 | 值类型 | 默认值 | 描述 | 兼容 |
---|---|---|---|---|
name | String | 应用名称 | ||
appid | String | 新建项目时,DCloud云端分配详情 勿自行修改 | 应用标识 | |
description | String | 应用描述 | ||
versionName | String | 版本名称 | ||
versionCode | String | 版本号 | ||
transformPx | Boolean | true | 是否转化项目的px,true转化为rpx | |
networkTimeout | Object | 网络超时 见 | ||
debug | Boolean | false | 是否开启debug模式 | |
app-plus | Object | 5+App特有配置 | ||
h5 | Object | H5特有配置 | ||
quickapp | Object | 快应用特有配置,即将支持 | ||
mp-weixin | Object | 微信特有配置 | ||
mp-alipay | Object | 支付宝特有配置 | ||
mp-baidu | Object | 百度特有配置 | ||
mp-toutiao | Object | 头条特有配置 | 1.6.0 | |
mp-qq | Object | QQ特有配置 | 2.1.0 |
各类网络请求的超时时间,默认值均为6000毫秒
属性 | 值类型 | 描述 |
---|---|---|
request | Number | uni.request 的超时时间 |
connectSocket | Number | uni.connectSocket 的超时时间 |
uploadFile | Number | uni.uploadFile 的超时时间 |
downloadFile | Number | uni.downloadFile 的超时时间 |
splash是App必然存在,不可取消的
属性 | 值类型 | 默认值 | 描述 |
---|---|---|---|
alwaysShowBeforRender | Boolean | true | 首页白屏时不关闭启动界面,支持最低1.6.0版本 |
autoclose | Boolean | true | 是否自动关闭程序启动界面。如须手动关闭,那么 alwaysShowBeforeRender 及autoclose 均须设置为false |
waiting | Boolean | true | 是否在程序启动界面显示等待圈或雪花 |
delay | Number | 0 | 启动界面在应用的首页加载完毕后延迟关闭的时间 |
1 |
|
uniapp
通过根目录中的pages.json
文件决定页面文件的路径、窗口样式、原生导航栏、底部原生tarBar等属性 | 值类型 | 是否必选 | 描述 | 兼容 |
---|---|---|---|---|
globalStyle | Object | 否 | 设置默认页面的窗口表现,可设置应用的状态栏、导航条、标题、窗口背景色等。 | |
pages | Object,Array | 是 | 设置页面的路径及窗口表现 | |
easycom | Object | 否 | 组件自动引入规则 | 2.5.0+ |
tabBar | Object | 否 | 设置底部tab的表现 | |
condition | Object | 否 | 启动模式配置 | |
subPackages | Object,Array | 否 | 分包加载配置 | |
preloadRule | Object | 否 | 分包预下载规则 | 微信小程序 |
workers | Scring | 否 | Worker 代码放置目录 | 微信小程序 |
1 | { |
当 navigationStyle":custom
或titleNView:false
时,原生导航栏不显示同时需注意:
uniapp
提供状态栏css变量,可使用view占用其位置cover-view
来解决,APP可使用titleNView 或subNVuenavigationBarTextStyle
,部分低端手机不支持鉴于以上问题,原生导航等满足业务需求,使用原生导航,甚至可牺牲一些不重要的需求。更多详情
import
,也无需在components
中声明,即可在页面中使用1 | "easycom": { |
属性 | 是否必选 | 值类型 | 默认值 | 描述 | 平台差异 |
---|---|---|---|---|---|
color | 是 | HexColor | tab字体默认颜色 | ||
selectedColor | 是 | HexColor | 选中颜色 | ||
backgroundColor | 是 | HexColor | 背景色 | ||
borderStyle | 否 | String | black | 边框颜色仅支持black/white | App最新版支持其它颜色 |
list | 是 | Array | tab列表最少2,最多5 | ||
position | 否 | String | bottom | 位置 bottom\top | 仅微信支持top |
fontSize | 否 | String | 10px | 字体大小 | App2.3.4+ |
iconWidth | 否 | String | 24px | icon默认宽度 | App2.3.4+ |
spacing | 否 | String | 3px | 图标与文字间间距 | App2.3.4+ |
height | 否 | String | 50px | 默认高度 | App2.3.4+ |
mindButton | 否 | Object | 中间按钮仅在list为偶数时生效 | App2.3.4+ |
list数组中的子项都为对象,其属性为:
属性 | 值类型 | 是否必选 | 说明 |
---|---|---|---|
pagePath | String | 是 | 页面路径,须在pages中选定义 |
text | String | 是 | tab是按钮文字,H5、5+APP平台非必填 |
iconPath | String | 否 | 图片路径,大小40kB,尺寸81*81,只支持静态图片,不支持字体图 |
selectedIconPath | String | 否 | 选中时的图片 |
属性 | 值类型 | 是否必选 | 默认值 | 说明 |
---|---|---|---|---|
width | String | 否 | 中间按钮的宽度,tabBar中其它项为减去此宽度后平分,默认值为与其它项平分 | |
height | String | 否 | 中间按钮的高度 | |
text | String | 否 | 中间按钮的文字 | |
iconPath | String | 否 | 中间按钮的图片路径 | |
iconWidth | String | 否 | 图片宽度 | |
backgroundImage | String | 否 | 背景图 |
mindButton 没有pagePath,需监听点击事件,自行处理点击后的逻辑,监听事件:uni.onTabBarMidBottonTap
详情,此事件仅支持 App
JS API
实现动态修改tabBaruni.switchTab
,不能使用uni.navigateTo
、uni,rediretTo
,使用 navigator
组件跳转时须设置属性open-type="switchTab"
如需先登录,后进入tab页面,无须将登录页设为首页,可参考HBuilderX新建项目时的登录模板
1 | "tabBar": { |
启动模式配置,仅开放环境有效,模拟直达页面的场景,(如:小程序转发后,用户点击所打开的页面)
属性 | 值类型 | 是否必选 | 描述 |
---|---|---|---|
current | Number | 是 | 当前激活的模式,list节点的索引值 |
list | Array | 是 | 启动模式列表 |
属性 | 值类型 | 是否必选 | 描述 |
---|---|---|---|
name | String | 是 | 启动模式名 |
path | String | 是 | 启动页面路径 |
query | String | 否 | 启动参数,可在onLoad中获取 |
1 | "condition": { //模式配置,仅开发期间生效 |
分包加载配置此配置为小程序的分包加载机制
root
下的相对路径vendor.js
过大情况可使用运行是压缩代码:HBuilderX创建的项目勾选 运行->运行到小程序模拟器->运行时是否压缩代码;cli项目可在 packge.json
中添加参数 --minimize
属性 | 值类型 | 是否必选 | 描述 |
---|---|---|---|
root | String | 是 | 子包根目录 |
pages | Array | 是 | 子包由哪些页面组成参数同 pages |
1 | { |
分包预加载配置。
属性 | 值类型 | 是否必选 | 描述 |
---|---|---|---|
packages | Array | 是 | 进入页面后预下载分包的root或name |
network | String | 否 | 在指定网络下预下载,all(不限网络)、wifi(默认仅WiFi下预下载) |
uni-app
是基于vueJS框架开发的微端应用框架,可一套代码跨ios\Android\H5\小程序等多个平台运行
可通过官方开发的HBuilderX IDE 创建uni-app
项目,开箱即用,可快速上手。
┌─common uni-app公共资源目录
│ └─com-a.js
│ └─com-a.css
┌─components uni-app组件目录
│ └─comp-a.vue 可复用的a组件
├─hybrid 存放本地网页的目录,详见
├─platforms 存放各平台专用页面的目录,详见
├─pages 业务页面文件存放的目录
│ ├─index
│ │ └─index.vue index页面
│ └─list
│ └─list.vue list页面
├─static 存放应用引用静态资源(如图片、视频等)的目录,注意:静态资源只能存放于此
├─wxcomponents 存放小程序组件的目录,详见
├─main.js Vue初始化入口文件
├─App.vue 应用配置,用来配置App全局样式以及监听 应用生命周期 详见
├─manifest.json 配置应用名称、appid、logo、版本等打包信息,详见
└─pages.json 配置页面路由、导航条、选项卡等页面类信息,详见
static中的 js文件不会被编译,如果使用ES6将会报错
css、less等资源放入公共资源目录中
应用生命周期仅只 App.vue
中可监听
函数名 | 说明 |
---|---|
onLaunch | 初始化项目完成时触发(仅触发一次) |
onShow | 启动项目或从后台进入前台显示时触发 |
onHide | 从前台隐藏至后台时触发 |
onError | 程序出错时触发 |
onuniViewMessage | 对 nvue 页面发送数据进行监听 详情 |
函数名 | 说明 |
---|---|
onLoad | 监听页面加载,可接受上个页面传递的数据,param[Object], 详情 |
onShow | 监听页面显示,每次出现在屏幕时触发 |
onReady | 页面初次渲染完成时触发,可能会在页面进入动画完成前触发 |
onHide | 从隐藏至后台时触发 |
onUnload | 监听页面卸载 |
onResize | 监听窗口变化 仅支持 5+App、微信小程序 |
onPullDownRefresh | 监听用户下拉动作,详情 |
onReachBottom | 监听页面上拉触底事件 |
onTabItemTap | 点击Tab触发,param[Object]:( {index:String,pagePath:String,text:String} )。仅支持 微信小程序、百度小程序、H5、5+App(自定义组件模式) |
onShareAppMessage | 用户点击右上角分享触发 仅支持 微信小程序、百度小程序、头条小程序、支付宝小程序 |
onPageScroll | 监听页面滚动,param[Object]:( {scrollTop:Number} 页面在垂直方向已滚动的距离(单位px) ) |
onNavigationBarButtonTap | 监听原生标题栏按钮点击事件,param[Object]:( {index:Number} ) 原生标题栏按钮数组的下标 仅支持 5+ App、H5 |
onBackPress | 监听页面返回,event对象为 {from:backbutton,navigateBack},backbutton:来源于左上角按钮或android返回键,navigateBack:来源于uni.navigateBack。详情 仅支持 5+ App、H5 |
onNavigationBarSearchInputChanged | 监听原生标题栏搜索输入框内容变化,param[Object] 仅支持 5+ App、H5 |
onNavigationBarSearchInputConfirmed | 监听原生标题栏搜索输入框搜索事件,点击软键盘上的搜索按钮,param[Object] 仅支持 5+ App、H5 |
onNavigationBarSearchInputClicked | 监听原生标题栏搜索输入框点击事件,param[Object] 仅支持 5+ App、H5 |
uni-app
的路由全权由框架统一管理,通过pages.json
配置每个路由页面路径及样式,不支持 vueRouter
其路由有两种方式可跳转:使用 navigation 组件跳转、调用API跳转
框架是以栈的形式管理所有页面,当路由切换时,页面栈的表现详见详情
判断开发生产环境(process.env.NODE_ENV)详情
判断平台通过编辑条件判断编译出包后的代码详情,通过API uni.getSystemInfoSync().platform
判断客户端环境 android/ios/devtools (小程序)
uni-app
支持通用单位px
,rpx
px
:固定的屏幕像素rpx
:响应式像素,是相对于基准宽度的单位,可以根据屏幕宽度进行自适应,uni-app
规定屏幕基准宽度 750rpx。转化公式(750 * 元素在设计稿中的宽度 / 设计稿基准宽度)
rpx
建议锁定屏幕方向nvue 不支持百分比,App端,在 pages.json仅支持px
静态样式统一写至class中,style只接受动态样式,这样可以避免性能的消耗
目前支持的选择器
class,id,element,::before:/::after(仅微信小程序和5+APP生效)
无法使用*
,page相当于body
App.vue 中的样式为全局样式,nvue不支持全局样式
变量 | 描述 |
---|---|
–status-bar-height | 系统状态栏高度,小程序为25px,H5为0 |
–window-top | 内容区域距离顶部的距离,小程序为0 ,H5为NavigationBar高度 |
–window-bottom | 内容区域距离底部部的距离,小程序为0 ,H5为TabBar高度 |
navigationStyle:"custom"
取消原生导航栏,由于窗体沉浸式,占据了状态栏位置。此时可使用var(--status-bar-height)
的view放在页面顶部,避免页面内容出现在状态栏。--status-bar-height
,可在页面onLoad时通过uni.getSystemInfoSync().statusBarHeight
获取状态栏高度,然后通过style绑定方式给占位view设定高度。NavigationBar导航栏( 固定高度44px
不可修改),TabBar 底部选项卡( 固定高度50px
不可修改)
~@
的方式引用图片,而V3版本设定为不自动转化成base641 | .test { |
https
1 | @font-face { |
事件是某事发生的信号,它可以被系统侦测到,从而触发某个函数或程序
DOM 事件标准描述了事件传播的 3 个阶段:
事件首先通过祖先链向下传递到元素(捕获),然后到达目标,最后上升(冒泡),在途中调用处理器。
冒泡:当事件发生再元素上,它首先会运行元素本身的处理器,然后运行父级上同类型的处理器,之后运行其它祖级上同类型的处理器(大多数事件都是冒泡行为,forcus等例外);可通过 event.stopPropagation()
通过 JSon<event>
属性、addEventListener(event,handler,false)
或HTML属性添加的函数,发生在冒泡阶段和目标阶段
1 | <style> |
JS中与鼠标相关事件:click
左击、dblclick
左双击、contextmenu
右击、mouseover / mouseenter(不会冒泡)
鼠标移入元素、mousemove / mouseleave(不会冒泡)
鼠标移出元素、mousedown
按下、mouseup
松开
数据更新有三种操作:插入数据(INSERT)、修改表中的数据(UPDATE)、删除数据(DELETE)
1 | INSERT [INTO] tbl_name [col_name,...] |
col_name :指定需要插入数据的列名列表。 如果向表中所有列插入数据,则全部列名可省略,这样做是不安全的,如果表结构发生变化,数据将会错乱。
向表的部分列插入数据,对于没被指定的列,其规则如下:
VALUES 或 VALUE
:包含各列需要插入数据的清单。 数据的顺序必须与列的顺序相对应,该子句的值可以是:
1 | mysql> INSERT INTO mysql_test.customers |
1 | mysql> INSERT INTO mysql_test.customers |
上述中未给出待插入表的列清单,这样的操作是不安全的须改成:1
2
3mysql> INSERT INTO mysql_test.customers(cust_Id,cust_name,cust_sex,cust_address)
-> Values(0,'李四',DEFAULT,'北京市')
Query OK, 1 row affected(0.09 sec)
当表的结构发生改变, INSERT 语句任能正确执行。
INSERT...SET
可以直接给表中的某些列指定对应的列值1
2INSERT [INTO] tbl_name
SET col_name1={expr|DEFAULT},col_name2={expr|DEFAULT},....
对于未指定的列为默认值1
2
3mysql> INSERT INTO mysql_test.customers
-> SET cust_address='武汉',cust_name="李四",cust_sex=DEFAULT
Query OK, 1 row affected(0.09 sec)
使用DELETE FROM tbl_name
可删除行数据
1 | DELETE FROM tbl_name |
-WHERE
:限定删除条件,从而删除特定的行,如不指定条件则删除指定表的所有行数据
ORDER BY
:各行按指定顺序进行删除LIMIT
:告知服务器在控制命令被返回到客户端前被删除行的最大值1 | DELETE FROM mysql_test.customers |
使用UPDATE
更新表中的数据
1 | UPDATE tbl_name |
-WHERE
:限定修改条件,从而修改特定的行,如不指定条件则修改指定表的所有行数据
ORDER BY
:各行按指定顺序进行修改LIMIT
:限定被修改的行数1 | UPDATE mysql_test.customers |
数据查询是SQL 语言的核心功能,是使用最多的操作
SELECT 可以从数据库中检索、统计或输出数据
执行过程是从数据库中选取匹配的特定行和列,并组成一个结果集放到临时表中返回。1
2
3
4
5
6
7
8
9
10
11SELECT
[ALL|DISTINCT|DISTINCTROW]
select_expr[,select_expr ...]
FROM table_references
[WHERE where_condition]
[GROUP BY {col_name|expr|position}
[ASC|DESC],...[WITH ROLLUP]]
[HAVING where_condition]
[ORDER BY {col_name|expr|position}
[ASC|DESC],...]
[LIMIT {[offset,]row_count|row_count OFFSET offset}]
SELECT 子句用于指定输出的字段; (必选)
FROM 子句用于指定数据的来源; (从表选择数据时使用)
WHERE 用于指数据的选择条件;
GROUP BY 用于对检索到的记录进行分组;(在按组计算聚合时使用)
HAVING 用于指定组的选择条件;
ORDER BY 用于对查询结果的排序;
如 HAVING 语句必须位于BROUP BY之后 OREDR BY 之前。
]]>索引是 DBMS 根据表中的一列或若干列按一定的顺序建立的列值与记录行之间的对应关系表,方便 DBA 管理
根据用途,索引在逻辑上大体分为三类
普通索引(INDEX): 最基本的索引类型,没有任何限制。通常使用关键字 INDEX 或 KEY
唯一性索引(UNIQUE):索引中所有的值只能出现一次,必须唯一 通常使用关键字 UNIQUE
主键(PRIMARY KEY):主键是一种唯一性索引。创建主键时,必须指定关键字 PRIMARY KEY,且不能有空值,一般在创建表的时候指定,也可通过修改表的方式添加,每张表只能有一个主键
分别有三种方式创建索引
CREATE INDEX
1 | CREATE [UNIQUE] INDEX index_name |
UNIQUE
:指定创建唯一性索引,一张表可以创建多个索引,每个索引在该表中名称唯一tabl_name
: 数据库的表名index_col_name
:关于索引的描述。格式为col_name[(length)][ASC|DESC]
col_name
:指定要创建索引的列名,lenght
:指定使用列的前length 个字符创建索引,有利于减小索引文件的大小ASC|DESC
指定按升序(ASC)或降序(DESC)排列,默认 ASC1 | mysql>CREATE INDEX index_customers |
CREATE TABLE
[CONSTRAINT [symbol]] PRIMARY KEY (index_col_name,...)
:创建新表的同时创建该表主键{INDEX|KEY}[index_name](index_col_name,...)
:创建表的同时创建该表索引[CONSTRAINT [symbol]] UNIQUE [INDEX|KEY] [index_name] (index_col_name,...)
:用于创建表时创建唯一性索引[CONSTRATIN [symbol]] FOREIGN KEY[index_name] (index_col_name,...)
:创建表的同时创建外键
KEY
: 关键字 INDEX的同义词
CONSTRAINT
:为主键、UNIQUE键、外键定义一个名字,使用 CREATE TABLE 定义列选项时,可以通过直接在某个列定义后面添加PRIMARY KEY
添加主键,主键由多列组成的多列索引时,不能使用此方法。1 | mysql> USE mysql_test |
ALTER TABLE
ADD {INDEX|KEY} [index_name] (index_col_name,...)
: 新增表列的同时添加索引ADD [CONTRAIN [smbol]] PRIMARY KEY [index_name] (index_col_name,...)
:新增列的同时添加主键ADD [CONTRAIN [smbol]] UNIQUE [INDEX|KEY] [index_name] (index_col_name,...)
: 新增列的同时添加唯一性索引ADD [CONTRAIN [smbol]] FOREIGN KEY [index_name] (index_col_name,...)
: 新增列的同时添加外键1 | mysql> ALTER TABLE mysql_test.seller |
使用 SHOW INDEX 查看索引
语法:1
2
3
4SHOW {INDEX|INDEXES|KEYS}
{FROM|IN} tbl_name
[{FROM|IN}db_name]
[WHERE expr]
使用 DROP INDEX 或 ALTER TABLE 删除索引
1 | DROP INDEX index_name ON tbl_name |
DROP PRIMARY KEY 删除表中主键
DROP INDEX 删除对应索引
DROP FOREIGN KEY 删除外键
1 | mysql> ALTER TABLE mysql_test.customers |
在MySQL中,使用 CREATE DATABASE 或 CREATE SCHEMA 语句创建数据库
语法结构:1
2
3CREATE {DATABASE|SCHEMA}[IF NOT EXISTS] db_name
[DEFAULT]CHARACTER SET [=]charest_name
|[DEFAULT]COLLATE [=]collation_name
[]
: 表示为可选|
: 用于分隔花括号中的选项,表示任选一项语法db_name
: 标识具体的数据库命名,必须符合操作系统文件夹命名规则,在MySQL中不区分大小写DEFAULT
: 默认值CHAREST SET
: 指定数据库字符集COLLATE
: 指定字符集校对规则IF NOT EXISTS
:创建数据库前进行判断,只有该数据库不存在时才能创建数据库
Example:
创建名称位 mysql_test 的数据库1
CREATE DATABASE mysql_test;
在次输入同样的命令 将会报错 可添加 IF NOT EXISTS
避免报错
MySQL 中创建数据库之后,不会自动使用新创建的数据库,可使用 USE
语句从当前环境切换换至新创建的数据库或其它数据库
Example:1
USE mysql_test;
MySQL 中使用 ALTER DATABASE 或使用 ALTER SCHEMA 语句,修改数据库的相关参数
语法结构:1
ALTER {DATABASE|SCHEMA}[db_name]
Example:
修改已有数据库默认字符集和校对规则1
2
3
4mysql> ALTER DATABASE mysqle_test
-> DEFAULT CHARACTER SET gb2312
-> DEFAULT COLLATE gb2312_chinese_ci;
...
MySQL 中使用 DROP DATABASE 或 DROP SCHEMA 来删除数据库,其数据永久删除
语法结构:1
DROP {DATABASE|SCHEMA}[IF EXISITS]db_name
Example:1
2DROP DATABASE IF EXISITS mysqle_test
...
MySQL 中使用 SHOW DATABASE 或 SHOW SCHEMA 来看可用数据库列表,只会列从出权限范围内的数据库
语法结构:1
SHOW {DATABASE|SCHEMA}[LIKE'pattern'|WHERE expr]
LIKE
: 匹配指定数据库名称WHERE
: 指定数据库名称查询范围
Example:1
SHOW DATABASE
只有成功创建数据库后,才能创建数据表,数据表是字段的集合,在表中数据按行和列的格式存储
MySQL 使用 CREATE TABLE 创建表。其中有多个选择,主要由表创建定义(create definition)、表选项定义(table options) 和区分选项(partition options)等内容构成。
表创建定义:由表列的名字、列的定义集可能的一个空值声明、一个完整性约束或表索引项组成,表索引项主要定义表的索引、主键、外键等。
语法结构:1
2
3
4
5
6
7CREATE[TEMPORARY]TABLE tbl_name
(
字段名|数据类型[列级完整性约束条件][默认值]
[,字段名2 数据类型[列级完整性约束条件][默认值]]
[,....]
[,表级完整性约束条件]
)[ENGINE=引擎类型]
Example:
新建一个客户信息1
2
3
4
5
6
7
8
9
10
11
12mysql> USE mysql_test
Database changed
mysql> CRATE TABLE customers
->(
-> cust_id INT NOT NULL AUTO_INCREMENT,
-> cust_name CHAR(50) NOT NULL,
-> cust_sex CHAR(1) NOT NULL DEFAULT 0,
-> cust_address CHAR(50) NULL
-> cust_contact CHAR(50) NULL
-> PRIMARY KEY(CUST_ID)
->)
Query OK, 0 rows affected(0.11 sec)
TEMPORARY:表示临时表,如果不选用则为持久表。
持久表一直存在,多个用户或应用程序可同时使用持久表,如果只需临时存放数据可添加 TEMPORARY 关键字
临时表只能对创建它的用户可见,断开数据库连接时,表会自动清除
数据类型指系统中所允许的数据的类型。每列都应有适当的数据类型,来限制或允许该列的数据。 建表时必须为每列指定正确的数据类型及数据长度 (CHAR(50))
MySQL 主要数据类型:
AUTO_INCREMENT: 表中数据类型为整型的列设置自增属性 (++i),从当前指或 1 开始,表中只能有一个 AUTO_INCREMENT。
当一个表列被指定为 AUTO_INCREMENT 后,其值可被覆盖,即可在表数据插入语句中为该列指定一个值(必须唯一),则该值将替换系统自动生成的值,后续增量基于该插入的值
DEFAULT:用于指定MySQL在未给值的情况下默认的值(DEFAULT 0)
如果未指定默认值,则自动为其分配一个值,如若该列可取值NULL,则默认NULL,若定义 NOT NULL,则默认取决于该列的类型:
NULL:没有值或缺值,允许NULL的列,插入行时可以不给该列的值;不允许NULL值的列,则该列必须有数据NULL
和 ''
是不对等的 NOT NULL 列中允许''
不允许 NULL
PRIMARY KEY :指定主键,主键必须唯一且不能为NULL, 如果是单列,值必须唯一,如果是组合列,则其组合的值必须唯一
通过使用 ALTER TABLE 来修改数据库
ADD[COLUMN]
:新增表列,可增多列使用逗号分隔即可1 | mysql> ALTER TABLE mysqle_test.customers |
AFTER:将新增的列添加到cut_sexl 列之后
FIRST:将新增的列添加到表的第一列
若使用上述关键字则将新增的列添加至表最后
类似的 可以使用 ADDPRIMARY KEY 、ADDFOREIGN KEY 、ADD INDEX 添加对应的 主键、外键、索引
CHANGE[COLUMN]
: 修改表中列的名称或数据类型,可修改多列使用逗号分隔即可1 | mysql> ALTER TABLE mysqle_test.customers |
如果将数据类型更换,可能会丢失该列原有的数据,如果视图改变的数据类型于原有的数据类型不兼容,则SQL命令不会执行,且抛出错误。
再兼容的情况下,该列的数据可能会被截断,如:一列的数据类型为 varchart(10),改为char(1),则该列中的数据’ShenZhen’会变为’S’
ALTER [COLUMN]
: 修改或删除指定列的默认值
1 | mysql> ALTER TABLE mysqle_test.customers |
MODIFY [COLUMN]
: 修改指定列的数据类型,通过 ‘FIRST’ 或 ‘AFTER’ 修改列的位置
1 | mysql> ALTER TABLE mysqle_test.customers |
DROP [COLUMN]
: 删除列,该列所有数据一并删除
1 | mysql> ALTER TABLE mysqle_test.customers |
同样 可使用 DROP PRIMARY KEY 、DROP FOREIGN KEY、DROP INDEX 删除对应的主键、外键、索引
RENAME[TO]
:表重命名1 | mysql> ALTER TABLE mysqle_test.customers |
除了 ALTER TABLE 中的 RENAME TO 修改表名,还可通过 RENAME TABLE 来修改单张和多张表(以逗号分隔)1
mysql> RENAME TABLE mysql_test.back.customers TO mysqle_test.customers
DROP[TEMPORARY]TABLE[IF EXISTS]
删除一个已存在的表,可以删除多张表,前提操作人必须有权限,但是操作人在该张表上的权限不会被删除
SHOW [FULL] TABLES [{FROM|IN}db_name] [LIKE'pattern'|WHERE expr]
: 显示指定数据库中所有表名Example:1
2
3
4
5
6mysql> USE mysql_test
Database changed
mysql> SHOW TABLES:
Tables_in_mysql_test
customers
1 row in set <0.01 sec>
SHOW [FULL] COLUMNS {FROM|IN}tb_name[{FROM|IN}db_name] 或 {DESCRIBE|DESC} tbl_name[col_name|wild]
: 显示指定数据库表结构。MySQL 支持使用 DESCRIBE 代替 SHOW COLUMNS FROM 来查看表结构
Example:1
2
3
4
5
6
7mysql> DESC mysql_test.custormes
Field Type Null key Default Extra
cust_id int<11> NO PRI NULL auto_increment
cust_name char<50> NO Null
cust_sex int<1> NO 0
3 row in set <1.56 sec>
Struture Query Langue (结构化查询语言,SQL),于1974年 Boyce 和 Chamberlin 提出。其已成为关系数据库的标准语言,是一种数据库查询和程序设计语言,用于存取数据及查询、更新和管理关系数据库系统,具有数据库定义、数据操作和数据控制等功能
SQL集数据查询(Data Query)、数据定义(Data Definition)、数据操纵(Data Manipulation)和数据控制(Data Control)四大功能于一体
主要用于对数据库及数据库中的各种对象进行创建、修改、删除等操作。数据库对象主要为 表、默认约束、规则、视图、触发器、存储过程等
关键字:
主要用于操作数据库中的各种对象,主要是检索和修改数据
关键字:
用于安全管理(权限)
MySQL是一个关系数据库管理系统(RDBMS),具有客户/服务器体系结构,由瑞典MySQL AB公司开发。 具有体积小、速度快、开源、遵循GPL(GNU通用公共许可证)等特点
MySQL在SQL标准的基础上增加了部分扩展的语言要素包括常量、变量、运算符、表达式、函数、流程控制语句和注解等。
算术运算符 | 位运算符 | 比较运算符 | 逻辑运算符 |
---|---|---|---|
+ | &(位与) | = | NOT 或 ! (逻辑非) |
- | l(位或) | > | AND 或 &&(逻辑与) |
* | ^(位异或) | < | OR 或 ll(逻辑或) |
/ | ~(位取反) | >= | XOR(逻辑异或) |
% | >>(位右移) | <= | |
<<(位左移) | <>(不等于)或 !=(不等于) | ||
<=>(相等或都等于空) |
SQL 的数据定义功能包括数据库模式、表、索引和视图的定义
SQL 标准不提供修改数库模式定义和修改视图定义的操作,如需修改对象,可先删除再创建,或通过RDBMS提供的扩展语句实现
SQL 标准不提供索引相关的语句
对数据库的增、删、改、查、选择等操作
]]>概念模式通常采取自顶向下法(实体分析法),通过两个步骤完成概念设计:
1.建立局部信息结构
2.将局部信息合并为全局信息结构并优化,使用 E-R 模型作为概念模型的描述工具
概念结构设计是将需求分析得到的用户需求抽象为信息结构(概念模型)的过程,通常使用E-R图作为建模工具具体由三部分组成:
实体间的联系通常指不同实体型的实体集之间的联系一般有三种情形
设两个实体集 A、B,两个实体型间的联系可分为 一对一、一对多、多对多
1> 一对一(1:1)
对于 A 中每一天实体, B 中最多有一个与之联系,反之亦然,则 A与B 记为 1:1
2> 一对多(1:N)
对于 A 中每一个实体,B 中有N个实体与之联系,反之,B的每一个实体,A中至多有一个实体与之对应,则记为 1:N
3> 多对多(M:N)
对于 A 中每个实体,B 中有N个实体与之联系,反之 B 中每个实体,A 中有M个实体与之联系,记为 (M:N)
example:
graph TBA[系] --1--> B{隶属}B --1--> C[系主任]a[班级] --1--> b{包含}b --N--> c[学生]q[学生] --M--> w{选课}w --N--> e[课程]
同两个实体之间的联系一样存在以上三种联系
example:
graph TBA[课程] --1--> B{讲授}B --M--> C[教师]B --N--> D[参考书]a[供应商] --M--> b{供应}b --N--> c[项目]b --P--> d[零件]
同一个实体集内的各实体间也可以存在以上三种联系
example:
graph LRA[职工] --1--> B{领导}B --N--> A
局部信息结构设计:根据需求分析报告中标明的不同用户视图范围所建立的满足该范围内用户需求的信息结构。通常为五个步骤
主要依据需求分析报告中标明的用户视图范围来确定局部范围;基本准则:部门和功能相对独立,同其他局部范围相互影响较小,且实体个数适量。
在确定的局部范围内选择一些合适的信息单位作为局部信息结构的基本实体
实体的存在依赖于关键字的存在。关键字属性确定后,实体的非关键字就易于确定了。
数据间的联系必须在概念设计时确定。
分析实体间是否存在联系的方法:将局部范围内的实体逐一取出与该范围内的其他实体试行匹配,能否找到与两个参加试匹配的实体都有关的问题或同一任务同时使用到参与试匹配的两个实体,存在则它们之间存在联系。
属性分为标识属性和说明属性两类。
标识属性作用实体的关键字,说明属性作用描述实体的一般特征
确定说明属性的基本原则: 说明属性的存在和使用依赖于标识属性。值为单值,不允许嵌套属性和重复组的现象出现在实体中。
将所有局部信息结构合并为一个全局信息结构。其必须是所有局部信息结构的全面准确的映像,形成的全局信息结构仍能实现各局部信息结构能实现的需求
合并是在假设各局部信息结构都说完全一致的前提下进行,即各局部信息结构能满足对于的需求,其内部不存在需要合并的成分。
由于局部信息结构仅以满足局部应用需求为目标,各个局部信息结构对同一数据对象因各自应用特征不同而可能采取不同处理,及每个开发人员对数据语义理解的差别等待,合并中会出现各种各样的冲突,需要合理的解决冲突才能进行合理的合并产出一个合理的全局信息结构。因此合并是一个不断发现和解决冲突的过程。
属性值域的冲突,如属性值的类型、取值范围、取值集合的不同
属性取值单位冲突,如某个属性有的值用 M 为度量单位,有的用 CM 为度量单位
同名异义:不同意义的实体类型或联系类型名在不同的局部应用中具有相同的名字
异名同义: 相同意义的实体类型或联系类型名在不同局部应用中具有不同的名字
同一对象在一个局部E-R图中作为实体,在另一个局部E-R途中作为属性
同一实体在不同E-R图中属性个数和类型不同
实体之间的联系在不同的E-R图中是不同的类型
对于属性、命名冲突,通常采用讨论、协商等行政手段解决
对于结构冲突,须通过认真分析,采用技术手段加以解决
一个好的全局E-R模型除能反映用户功能需求之外,实体类型个数尽可能少,实体类型所含属性尽可能少,实体间联系无冗余。
全局E-R模型的优化可通过上述三个条件来完成
逻辑结构设计是将概念模型转换为具体的 DBMS 所支持的逻辑数据模型,即将E-R图转换为关系模型、对关系数据模型进行优化、设计面向用户的外模式。
一个实体型转换为一个关系模式。实体的属性转换为关系的属性,实体码作为关系码
一个一对一(1:1)联系转换为一个独立的关系模式,可与任意一端对应的关系模式合并。该联系相连的各实体码及联系本身的属性转换为关系的属性,每个实体码为关系候选码
一个一对多(1:N)联系转换为一个独立关系模式,可与N端对应的关系模式合并。同样相连的各实体码及联系本身属性均转换为关系的属性,关系的码为N端实体的码
一个多对多(M:N)联系转换为一个关系模式,与该联系相连的各实体码及联系本身的实现转换为关系属性,关系的码为各个实体码的组合
三个及三个以上实体间的一个多元联系转换为一个关系模式。与该多元联系相连的实体码及联系本身的属性转换为关系的属性,关系码为各个实体的组合
相同码的关系模式可合并
关系数据模型的优化通常参考关系规范化理论
将概念模型转换为全局逻辑模型后,可根据局部应用需求,利用视图设计更符合局部用户需要的用户外模式
定义数据库全局模式主要从系统时间效率、空间效率、以为会角度出发,用户外模式与模式是相对独立的,因此外模式可注重考虑用户的习惯于方便。
建立索引,通过 DBMS 提供的有关命令实现(有静态(频率高才用)和动态两种方式)
建立聚集,将相关数据集中存放的物理存储技术
针对具体的应用场景,使用现有的 DBMS 构建适合的数据库模式,建立数据库及其应用系统,使之能有效的收集、存储、操作和管理数据,满足实际业务中各类用户的应用需求、信息需求和处理需求,这个过程称为数据库设计。
1.数据库生命周期,从演变过程的角度分为两个阶段:分析与设计阶段 和 实现与操作阶段
1.1 分析与设计阶段细分为四个环节:需求方分析、概念设计、逻辑结构设计和物理结构设计。
1.2 实现与操作阶段细分为3个环节:数据库的实现、操作与监督和修改与调整。
数据库设计主要以满足应用的功能需求和良好的数据库性能为目标。
数据库设计是从用户对数据的需求出发,研究并构造数据库的过程,包括两个方面:数据库结构设计(概念、逻辑和物理结构设计)和行为设计(对数据库的操作)
数据库设计的优劣,会直接影响当前的应用、数据库应用过程中的维护和生命周期,为使数据库设计更加合理,需要一个有效的指导原则(方法),大体分为三类:直观设计法、规范设计法和计算机辅助设计法。
4.1 直观设计法:利用设计者的经验和技巧来设计数据库模式。此方法缺乏科学理论指导,质量很难保证。
4.2 规范设计法:又细分为 新奥尔良设计法、基于 E-R 模型的数据库设计法和基于第三范式的设计方法。
4.2.1 新奥尔良设计法:将数据库设计为四个阶段(需求分析、概念结构设计、逻辑结构设计和物理结构设计,注重结构设计)
4.2.2 E-R模型数据设计法:在需求分析的基础上用E-R图像构造一个反应现实世界实体之间联系的企业模式,然后将模式转换成某一特定 DBMS 下的概念模式。
4.2.3 基于第三范式的设计方法:在需求分析的基础上先确定数据库的模式,属性及属性间的依赖概念性,进行模式分解,规范成若干个第三范式关系模式的集合。
计算机辅助设计方法:以领域专家的知识或经验为主导,模拟某一规范化设计的方法,通常通过人机交互的方式来完成设计的某些过程。
数据库设计的过程六大阶段:需求分析 -> 结构设计(概念、逻辑和物理结构设计)∪ 行为设计(功能、事务和程序设计) -> 数据库实施(加载数据库数据和调试运行应用程序) -> 数据库运行和维护
graph LRA(需求分析) --> B(结构设计)A --> C(行为设计)B --> D(数据库实施)C --> D(数据库实施)D --> E(数据库运行与维护)
数据库设计过程实际是一个反复修改、反复设计的迭代过程。
需求分析是数据库设计的起点,直接影响后续阶段的设计和数据库系统能否被合理使用。分四个步骤:确定数据库范围、分析数据应用过程、收集与分析数据和编写需求分析报告。
需求分析的目标是了解与分析用户的信息及应用处理的要求,并将结果按一定格式整理形成需求分析报告。
数据库设计人员进行需求分析基本方法:听取数据库应用部们人员的报告,并沟通。同时需求分析人员提交一份需求调查表,该表内容主要包括调查的内容和要求提供资料的格式,应用部门的业务人员可根据该表进行准备和提交材料;此外数据库设计人员还需查阅原始资料,及跟班作业等
范围指数据库应支持哪些应用功能。该范围应尽可能的考虑较为广泛的应用部门或领域,充分满足用户的应用功能要求,有效地利用计算机设备及数据库系统的潜在能力。同时还应尽可能考虑将来的应用需求,提高数据库应变能力,避免以后频繁修改。
满足上述要求的数据库是复杂而庞大的,由于诸多因素的影响,设计人员当首先考虑支持用户工作需要所必须的应用要求。
此过程分析指了解并分析数据与数据处理间的关系。在确定数据库范围后,设计人员应逐次地了解分析每一部门或功能要用到哪些数据、数据的使用顺序、对数据作何处理和处理的策略及处理结果等
过程分析的结果是数据库结构设计的重要依据。
数据收集与分析是指了解并分析数据的组成格式及操作特征,每个数据元素的语义及关系等,并将它们收集起来整理归档。
可从三个方面展开工作:静态结构、动态结构及数据约束。
静态结构指不施加应用操作于其上时数据的原始状况。通过数据分类表和数据元素表来说明
1)数据分类表用于数据的总体描述。对于每一客观存在的具有独立意义的单类数据单位应给出其名称、用途、编制者及使用者等说明:
数据ID | 数据名 | 用途 | 主人 | 用户 | 来源 | 去向 | 存档时间 | 数据量 |
---|---|---|---|---|---|---|---|---|
2)数据元素表
数据元素表指通常意义下的数据项或属性。数据分类表中的每一类数据的所有数据元素名称、类型、长度、意义及算法等都应在数据元素表中进行详尽说明。格式如下:
数据ID | 数据元素ID | 元素名 | 意义 | 类型 | 长度 | 算法 | 备注 |
---|---|---|---|---|---|---|---|
类型:描述元素的数据特征(字符串、整数型、实数型)
动态结构指将应用操作施加于数据之上的数据状况,可通过任务分类表和数据操作特征表进行说明
1)任务分类表
根据对数据流程图的分析,可将业务处理过程划分不同任务。 一个任务指为完成某一特定处理功能的相对独立的操作序列。格式如下:
任务ID | 名称 | 功能 | 类型 | 主人 | 用户 | 执行日期 | 频率 | 操作过程 | 备注 |
---|---|---|---|---|---|---|---|---|---|
类型:输入、查询、制表、统计、修改、删除等
2)数据操作特征表
数据操作特征表用来描述任务和数据之间的关系,包括不同任务对数据执行不同操作的频率。一条任务或数据分类表须建立对应的操作特征表。格式如下:
任务ID | 数据ID | 建立 | 查询 | 插入 | 修改 | 删除 | 数据量 |
---|---|---|---|---|---|---|---|
数据约束指使用数据时的特殊要求。主要有四个方面:
需求分析报告要求包括6个方面(数据库的应用功能目标(明确数据库应用范围及应达到的应用处理功能)、标明不同用户视图范围)、应用处理过程需求说明、数据字典、数据量、数据约束:
数据字典是DBS中存储三级结构定义的数据库,通常指数据库系统中各类数据详细描述的集合。功能是存储和检索各种数据描述(元数据),提供对各类数据的集中管理,是一种数据分析、系统设计和管理的有力工具。
数据字典包括数据分类表、数据元素表和各类原始资料(所有单据、报表、文件及设计所需的原始资料,并根据数据分类表的数据ID统一分类编号)。
概念设计结构是在需求分析中产生的需求分析报告基础上按照特定的方法设计满足应用需求的用户信息结构,通常称为概念模型
概念模型独立于任何软件硬件,主要目标是最大限度的满足应用需求,完全不顾忌软件硬件的限制,尤其是DBMS 的限制,它是一个符合用户要求的趋于理想化的信息结构,常用方法有实体分析法(自顶向下)和属性综合法(自顶向上)
逻辑模型是将概念模型转换为等价的、并为特定 DBMS 所支持数据模型的结构。主要有层次、网状、关系模型
逻辑模型是在需求分析与概念模型的基础上进行的,主要提供如下输入信息:
输出信息:
graph LRA(概念设计) --> B(模型转换)B --> C(子模型设计)B --> D(应用程序设计说明)C --> E(设计评价)D --> EE --> F(物理设计)
物理设计指对于一个给定的数据库逻辑结构,研究并构造物理结构的过程,主要是确定数据库在存储设备上的存储结构及存储方法, 因 DBMS 不同可能包括建立索引和聚集等待。
本阶段需要完成 加载数据、应用程序设计和数据库试的运行工作
加载数据:将符合要求的初始数据装载到数据库中,包括数据的收集、分类、整理校验和输入等过程
经过试运行后,确认系统无故障或暂未发现故障时,系统才可投入生成实际中运行,随着应用的深入和拓展,可能会暴露原未发现的问题,也有可能对数据的不断增、删、改使系统的物理结构变坏或存取效率下降,或者需要拓展应用功能,这些都需要开发人员做好维护工作。
]]>规范化理论研究的是关系模式中各属性间的依赖关系及对其概念性模式性能的影响,它提供了判断关系模式优劣的理论标准,能帮助数据库设计人员预测可能出现的问题。
规范化理论主要应用于数据库设计中的概念设计阶段。
关系模式可能存在如下问题:
数据冗余指同一数据被反复存储的情况。如在一个供应商关系模式中,一个供应商每供应一种货物,其地址就存储一次,如果供应成千上万种货物,地址就会反复成千上完成。
更新异常
数据冗余将导致存储空间的浪费和潜 在数据不一致性及修改麻烦问题。如供应1000种货物的供应商的地址信息发生变化,那么需要对这些供应商的地址进行逐一修改,这样就有可能在一个元组中修改了地址,而没修改该另一个元组中同一供应商的地址,从而导致与实际情况不相符
插入异常
插入异常指应该插入到数据库中的数据不能只需插入操作的情形。
删除异常
数据的删除操作异常指不应该删除的数据被删除的情形。
产生上述问题的原因,及消除这些问题的方法,都与数据库依赖的概念密切相关。数据依赖是可以作为关系模式的取值的任何一个关系所必须满足的一种约束条件,是通过一个关系中各个元组的某些属性值之间的相等与否体现出来的相互关系。
函数依赖指关系中属性间的对应关系
设R 为任一给定关系,如果对于 R 中属性 X 的每个值,R 中的属性 Y 只有唯一值与之对应,则称 X 函数决定 Y (Y 函数依赖于 X) 记作 $X\to Y$。 X称为决定因素
example:
表 T1
学号(SNO) | 姓名(SNAME) | 性别(SSEX) | 宿舍(SROOM) |
---|---|---|---|
0001 | 张三 | 男 | N101 |
0002 | 王二 | 男 | N101 |
0003 | 李梅 | 女 | C101 |
T1中存在如下函数依赖:
$SNO\to SName$
$SNO\to SSEX$
$SNO\to SROOM$
T1 中的函数依赖关系仅当SNO作为决定因素时存在
设 R 为任一给定定关系,X、Y 为其属性集, 若$X\to Y$,且 X 中的任一真子集 $X^{‘}$都有 Y 函数不依赖于 $X^{‘}$,则 Y 完全依赖于 X
Example:
表 T2
学号(SNO) | 课程编号(CNO) | 课程名(CTITLE) | 授课老师(INAME) | 成绩(GRADE) |
---|---|---|---|---|
0001 | 201 | 语 | 张三 | 80 |
0002 | 202 | 数 | 李四 | 90 |
0003 | 203 | 英 | 王五 | 60 |
T2 中,函数依赖:$(SNO,CNO)\to GRADE$ ,它为完全函数依赖。因为其中单个属性 SNO/CNO 都不能单独决定GRADE
设 R 为任一给定关系, X、Y 为其属性集合,若$X\to Y$,且 X 中存在某个真子集 $X^{‘}$满足 $X^{‘}\to Y$ ,则 Y 部分函数依赖于 X。
T1 中 函数依赖$(SNO,SNAME)\to SSEX$,而其中$SNO\to SSEX$ ,那么 SSEX部分函数依赖于(SNO,SNAME)
设 R 为任一给定关系, X、Y、Z为不同属性子集,若$X\to Y$,X函数不依赖于Y,$Y\to Z$,则 $X\to Z$,即 Z传递函数依赖于X。
Example:
有一个关系模式 T2(BNO(书号),PNAME(出版社名),PADDRESS(出版社地址)),一种书对应一个唯一的书号,且只能为某一出版社出版;
一个出版社只有唯一名称和地址,但一个出版社可出版多种书。
那么该关系中存在函数依赖:$BNO \to PNAME$, $PNAME\to PADDRESS$, PNAME函数不依赖于BNO,所以$BNO\to PADDRESS$
设 R 为任一给定关系,U 为所有属性集合, X 为 U 的子集,若 U 完全依赖于 X,则 X 为 R 的候选关键字。
关系数据库中的关系需要满足一定的要求,不同程度的要求称为不同的范式(Normal Form,NF)。
设 R 为任一给定关系, R 中每个列和行的交点处的取值都是不可再分的基本元素,则 R 为 1FN。 1FN是范式的最低要求,是一个不含重复组的关系,不存在嵌套结构。
表 T3
SNO | CNO | CTITLE | INAME | IPLACE | GRADE |
---|---|---|---|---|---|
1027 | C01 | 操作系统 | 王五 | 东01 | 100 |
1028 | C02 | 数据库 | 刘备 | 东02 | 91 |
1029 | C01 | 操作系统 | 王五 | 东01 | 88 |
C03 | 人工智能 | 曹操 | 东03 | 100 | |
1030 | C04 | C语言 | 刘备 | 东02 | 97 |
T3关系是一个非归范式关系,因为 SNO属性中 1029出现重复的组,可将T3转化为 1FN
T4 1FN
SNO | CNO | CTITLE | INAME | IPLACE | GRADE |
---|---|---|---|---|---|
1027 | C01 | 操作系统 | 王五 | 东01 | 100 |
1028 | C02 | 数据库 | 刘备 | 东02 | 91 |
1029 | C01 | 操作系统 | 王五 | 东01 | 88 |
1029 | C03 | 人工智能 | 曹操 | 东03 | 100 |
1030 | C04 | C语言 | 刘备 | 东02 | 97 |
设 R 为任一给定关系,如果 R 为 1FN,且所有非主属性都完全函数依赖于候选关键字,则 R为 2FN。
Example:
T4 中存在着冗余度高、插入和删除操作异常等问题,CTITLE 中都某一课程被多人选修,那么对应的授课老师和地址将反复存储(数据冗余);若新增一门课程,而没人任何同学选修,则这们课程将无法存储(插入异常);如果将最后一元组删除,同时会删除C语言这门课程及相关老师和地址等信息(删除异常);
存在这些问题的原因在于仅有非主属性 GEEADE 完全 依赖于(SNO,CNO),其他非主属性都只依赖于 CNO ,对于主键(SNO,CNO)为部分依赖
通过分解 T4 将部分函数依赖分解成完全函数依赖,得到 2FN
T4.1
SNO | CNO | GRADE |
---|---|---|
1027 | C01 | 100 |
1028 | C02 | 91 |
1029 | C01 | 88 |
1029 | C03 | 100 |
1030 | C04 | 97 |
T4.2
CNO | CTITLE | INAME | IPLACE |
---|---|---|---|
C01 | 操作系统 | 王五 | 东01 |
C02 | 数据库 | 刘备 | 东02 |
C03 | 人工智能 | 曹操 | 东03 |
C04 | C语言 | 刘备 | 东02 |
此时的 T4.2依然存在插入、删除操作及修改麻烦等异常问题。如:将一位新老师插入 T4.2表中,但这位老师暂无任何教学工作,因缺关键字 CNO的值而不能执行插入操作。
原因在于:T4.2 关系中存在非主属性对主属性的传递函数依赖,须进一步分解。
设 R 未任一给定关系, 如 R 未 2FN,且每一个非主属性都不传递依赖于候选关键字,则 R 为3FN。
Example:
通过分解 T4.2 将传递函数依赖分解成完全函数依赖,得到 3FN
T4.2.1
CNO | CTITLE | INAME |
---|---|---|
C01 | 操作系统 | 王五 |
C02 | 数据库 | 刘备 |
C03 | 人工智能 | 曹操 |
C04 | C语言 | 刘备 |
T4.2.2
INAME | IPLACE |
---|---|
王五 | 东01 |
刘备 | 东02 |
曹操 | 东03 |
通常 3FN 大多数能解决插入和删除操作异常的问题,数据冗余也能得到有效控制。为解决3FN有时出现的操作问题,R.F.Boyce和E.F.Codd 提出 改进范式 BCNF
设 R 为任一给定关系,X、Y 为属性集,F为其函数依赖集, 若 R 为 3NF,且 F 中所有函数依赖 $X\to Y$ (Y 不属于 X)中 X 必须包含候选关键字,则 R 为 BCNF。 即 R中每一函数依赖的决定因素X(可为单一属性或组合属性) 都包含 候选关键字,则 R 为 BCNF。
当所有属性集合为候选关键字时依然会存在操作异常和数据冗余等问题
Example:
表 T5
SNO | CTITLE | TNAME |
---|---|---|
S01 | 操作系统 | 王五 |
S02 | 人工智能 | 曹操 |
S02 | 数据库 | 刘备 |
S03 | 数据库 | 孙权 |
T5中新增一门课程和一位老师的数据时,须至少有一位学生选修该课且指导老师已被分配才能插入T5中。
此时可通过公共的函数依赖将 T5分解位为 T5.1 和 T5.2
T5.1
SNO | TNAME |
---|---|
S01 | 王五 |
S02 | 曹操 |
S02 | 刘备 |
S03 | 孙权 |
T5.2
TNAME | CTITLE |
---|---|
王五 | 操作系统 |
曹操 | 数据库 |
刘备 | 人工智能 |
孙权 | C语言 |
数据完整性指数据库中数据的正确性、相容性和一致性。包括现实世界中的应用需求的完整性。数据的完整性由完整性规则来定义。
关系模型的完整性规则是对关系的某种约束,提供一种手段来保证用户对数据库的修改时不会破坏数据库中数据的完整性。保证数据是有意义的。
关系模型分三类约束:实体完整性约束、参照完整性约束和用户自定义完整性约束。 前两者是必须满足的条件,称作关系的两个不变性。由DBMS自动支持
此约束指关系的主属性,主码不能为空,在关系数据库系统中,一个关系对应一张表,实体完整性指在数据存储数据的表中,主键/码不能取控值 NULL
现实世界中实体之间往往存在某种联系,在关系模型中这种联系通过关系来描述
参照完整性约束就说定义外码和主码之间的引用规则,是对关系间引用数据的一种限制。若属性(属性组)X 是基本关系 R 的外码,它与基本关系 S 的主码 Y 对应,那么 R 中每个元组在 F 上的值要么取 NULL,要么等于 S中对应元组的主码值。 R 和 S 可以是不同的关系,也可以是同一关系。
如:1
2教师(职工号,姓名,性别,系编号)
系(系编号,系名,办公地点)
上述两个关系之间存在属性的引用,系编码既是 系
关系的主码又是教师
关系的外部码。那么教师
关系中系编码属性的取值需要参照 系
关系中系编码的值或为 NULL。
此约束针对某一应用环境的完整性约束条件,反映了某一具体应用所涉及的数据应满足的要求。关系模型提供定义和检验的机制,此类规则一般在建立数据库表的同时进行定义,如果某些条件未建立在库表一级,则应在各个模块的具体编程中通过程序进行检查和控制。
在对数据库进行修改时须检验是否满足对上述三类完整性约束
首先检查实体完整性约束,检查插入行在主码属性上的值是否已存在,不存在,可以执行插入,否则不可插入。再检查参照完整性约束,如果是向被参照关系插入,则不需要考虑此约束;如果向参照关系插入,则检查插入行在外码属性上的值是否已在相应被参照关系的主码属性中存在,存在,可插入,否则不可插入,或者将插入行的外码属性的值改为NULL,再插入,最后检查自定义完整性约束,包括数据的类性、精度、取值范围、是否允许空值、是否有默认值等,满足即可执行插入操作,否则给出错误信息。
一般只需对被参照关系检查参照完整性约束。如果主键被引用则不可删,或将参照关系中对应行的外码属性改为为NULL,再删除
结合删除 和 插入操作,先删除再插入。
]]>增(插入 Insert)、删(Delete)、改(Update)、查(Query)。关系的查询表达能力是关系操作最主要的部分。查又可分为选择、投影、连接、除、并、差、交、笛卡尔积。集合操作方式(操作的对象和结果都是集合)。又称为一次一集合(set-at-a-time)
通过关系语言实现关系操作。用户不必请求DBM为其建立特殊的存取路径,由 DBMS 的优化机制来完成。
关系代数是关系操作语言中的传统表示方式,以集合代数为基础发展而来。任何一种操作都是将一定的操作符作用域一定的操作对象上,得到预期的操作结果。
而对象和结果均为关系。关系代数直接应用关系的运算来表达操作的目的,运算符包括集合运算符和专门的关系运算符。
运算符 | 含义 | |
---|---|---|
集合运算符 | ∪ | 并 |
− | 差 | |
∩ | 交 | |
× | 笛卡尔积 | |
专门的关系运算符 | σ | 选择 |
π | 投影 | |
⋈ | 连接 | |
÷ | 除 | |
比较操作符 | > | 大于 |
≥ | 大于等于 | |
< | 小于 | |
≤ | 小于等于 | |
= | 等于 | |
≠ | 不等于 | |
比较操作符 | ¬ | 非 |
∧ | 与 | |
∨ | 或 |
关系代数操作经过有限次复合的式子称为关系代数操作表达式(关系代数表达式),可使用表达式表示所需要执行的各种数据查询和修改处理,所有关系代数是一种抽象的查询语言,通过对关系的操作来表达查询。
按运算符分类,关系代数操作可分为:传统的集合运算和专门的关系运算
传统集合运算是二目运算,将关系看成元组集合,运算从行的角度来进行,具有 并、差、交、迪卡尔积四种运算。
Example:
表 T1
学号(SNO) | 姓名(SNAME) | 性别(SSEX) | 宿舍(SROOM) |
---|---|---|---|
0001 | 张三 | 男 | N101 |
0002 | 王二 | 男 | N101 |
0003 | 李梅 | 女 | C101 |
表 T2
学号(SNO) | 姓名(SNAME) | 性别(SSEX) | 宿舍(SROOM) |
---|---|---|---|
0004 | 刘八 | 男 | D101 |
0005 | 赵二 | 男 | B201 |
0003 | 李梅 | 女 | C101 |
表T1 和 表T2 使用并运算产生一个新表T3,(T3 = T1 ∪ T2)它是由T1和T2所有不同元组所组成,且 T1和T2属性个数、值域相同。下表为 T1 ∪ T2的结果
表 T3
学号(SNO) | 姓名(SNAME) | 性别(SSEX) | 宿舍(SROOM) |
---|---|---|---|
0001 | 张三 | 男 | N101 |
0002 | 王二 | 男 | N101 |
0003 | 李梅 | 女 | C101 |
0004 | 刘八 | 男 | D101 |
0005 | 赵二 | 男 | B201 |
表T1 和 表T2 使用差运算产生一个新表T4,(T4 = T1 - T2)它有T1的所有元组但不包含T2的元组,且 T1和T2属性个数、值域必须相同。下表为 T1 - T2的结果
表 T4
学号(SNO) | 姓名(SNAME) | 性别(SSEX) | 宿舍(SROOM) |
---|---|---|---|
0001 | 张三 | 男 | N101 |
0002 | 王二 | 男 | N101 |
表T1 和 表T2 使用交运算产生一个新表T5,(T5 = T1 ∩ T2)它同时包含T1和T2相同的所有元组,且 T1和T2属性个数、值域必须相同,交运算可由差运算表示(T1∩T2 = T1-(T1-T2))。下表为 T1 ∩ T2的结果
表 T5
学号(SNO) | 姓名(SNAME) | 性别(SSEX) | 宿舍(SROOM) |
---|---|---|---|
0003 | 李梅 | 女 | C101 |
表T6 和 表T7 使用笛卡尔积运算产生一个新表T8,(T8 = T6 × T7)它是T6和T7的所有元组连接而成,即将两张表的元关系合并,且T6的每一元组都对应T7所有的元组
下表为 T6 × T7的结果
表 T6
学号(SNO) | 姓名(SNAME) |
---|---|
0001 | 张三 |
0002 | 王二 |
表 T7
课程号(CNO) | 课程名(CNAME) | 教室(SSEX) |
---|---|---|
1 | 数据库 | C-101 |
2 | 操作系统 | C-102 |
表 T8
学号(SNO) | 姓名(SNAME) | 课程号(CNO) | 课程名(CNAME) | 教室(SSEX) |
---|---|---|---|---|
0001 | 张三 | 1 | 数据库 | C-101 |
0001 | 张三 | 2 | 操作系统 | C-102 |
0002 | 王二 | 1 | 数据库 | C-101 |
0002 | 王二 | 2 | 操作系统 | C-102 |
此运算即涉及行,又涉及列,分为一元专门关系操作和二元专门关系操作
选择运算( $σ_F(R)$ ),F为条件表达式,R为指定的被运算关系名。 从指定关系中选取满足条件的若干元组组成一个新关系1
SELECT 关系名 WHERE 条件语句(表达式)
条件语句:由常数、属性名或列名、比较操作符及逻辑操作符组成
Example:1
SELECT T8 WHERE 姓名 = "张三"
表 T9
学号(SNO) | 姓名(SNAME) | 课程号(CNO) | 课程名(CNAME) | 教室(SSEX) |
---|---|---|---|---|
0001 | 张三 | 1 | 数据库 | C-101 |
0001 | 张三 | 2 | 操作系统 | C-102 |
投影运算( $π_A(R)$ ), R为被运算关系,A为属性序列,从指定关系中选取指定的若干属性值组成新关系1
PROJECTION 关系名 ( 属性名1, 属性名2 ,... )
组成的新关系自动去重
Example:1
PROJECTION T8 (课程号,课程名)
表 T10
课程号(CNO) | 课程名(CNAME) |
---|---|
1 | 数据库 |
2 | 操作系统 |
连接运算($R\cfrac{⋈}{xθy}S$),其中,R和S 代表两个不同的关系;
x 和 y 分别表示R中的第x列和S中的第y列属性;
θ表示比较运算符(>、≥、<、≤、=、≠)
从笛卡尔积 R × S 中选取R的第x列属性值与S的第y列属性值满足θ 的那些元组组成一个新关系。
1 | JOIN 关系1 AND 关系2 WHERE 条件语句 |
条件语句:由比较操作符和属性名或列名组成的表达式
Example:
表 T11
A | B | C |
---|---|---|
a | b | c |
d | e | f |
表 T12
D | E | A |
---|---|---|
g | h | a |
b | c | d |
1 | JOIN T11 AND T12 WHERE C = E |
T11 × T12
T11.A | B | C | D | E | T12.A |
---|---|---|---|---|---|
a | b | c | g | h | a |
a | b | c | b | c | d |
d | e | f | g | h | a |
d | e | f | b | c | d |
等值结果为:
表 T13
T11.A | B | C | D | E | T12.A |
---|---|---|---|---|---|
a | b | c | b | c | d |
1 | JOIN T11 AND T12 WHERE A = A |
表 T14
T11.A | B | C | D | E | T12.A |
---|---|---|---|---|---|
a | b | c | g | h | a |
d | e | f | b | c | d |
表 T14.2
A | B | C | D | E |
---|---|---|---|---|
a | b | c | g | h |
d | e | f | b | c |
自然连接是构造新关系的有效方法,投影和选择是分解关系的有效方法,自然连接中如果两个关系没有公共属性则变成笛卡尔积
除运算(R÷S) R和S代表两个不同的关系。
假如被除关系R 为 m 元关系,除关系S 为 n 元关系,则运算结果的新关系为 m-n元关系。
Example 1:
表 T15
A | B | C | D | E | F | G |
---|---|---|---|---|---|---|
a | b | c | d | e | f | g |
h | i | j | k | l | m | n |
a | b | c | d | e | c | d |
a | c | e | f | b | m | n |
a | b | c | d | e | b | h |
a | b | c | d | e | g | h |
表 T16
H | F | G |
---|---|---|
b | f | g |
c | m | n |
b | c | d |
c | b | h |
T15 ÷ T16
运算步骤:
X 投影
A | B | C | D | E |
---|---|---|---|---|
a | b | c | d | e |
h | i | j | k | l |
a | b | c | d | e |
a | c | e | f | b |
a | b | c | d | e |
a | b | c | d | e |
1 | // 列出 x 集合中的值 和对应象集 |
通过对比发现 只有a,b,c,d,e值对应的象集包含关系T16的投影集,所以结果接
A | B | C | D | E |
---|---|---|---|---|
a | b | c | d | e |
关系数据库的基本特征是使用关系模型的组织数据,20世纪80年代以后,在商用DBMS中,关系模型逐步取代早期的网状模型和层次模型。
作为数据模型,关系模型包含三个组成要素:关系数据结构、关系操作集合和关系完整性约束。
结构只包含单一的数据结构(关系),现实世界的实体与实体间的各种联系均用关系来表示。关系模型是把数据库表示为关系的集合,并以二维表格的形式组织数据。
录入一张二维表格如:
学号 | 姓名 | 性别 | 籍贯 | 民族 | … |
---|---|---|---|---|---|
001 | 张三 | 男 | 陕西 | 汉 | … |
002 | 李四 | 男 | 湘西 | 苗 | … |
003 | 王五 | 男 | 河北 | 汉 | … |
004 | 赵六 | 男 | 东北 | 汉 | … |
… |
中文字段名 | 数据类型 | 宽度 | … |
---|---|---|---|
学号 | 字符类型 | 8 | … |
姓名 | 字符类型 | 10 | … |
身份证 | 字符类型 | 18 | … |
… | … | … | … |
上表是学生基本星系登记表关系的结构定义,关系则是元组的集合,是关系模式在某一时刻的状态或内容
实际工作中关系模式和关系统称为关系。
在实际的数据库应用系统中,一般使用英文作为表名、字段名等。因为在编写数据库应用程序时,表名、字段名会作为变量名,使用中文不方便标识,且有些DBMS不能很好的兼容中文。
因此上表应该变更为:
含义 | 字段名 | 数据类型 | 宽度 | … |
---|---|---|---|---|
学号 | studentNo | 字符类型 | 8 | … |
姓名 | sutdentName | 字符类型 | 10 | … |
身份证 | studentId | 字符类型 | 18 | … |
… | … | … | … | … |
关系数据库对关系的限定:
注:数据库( DB )数据库系统(DBS)数据库管理系统(DBMS) 数据库管理员(DBA)
在一个DBS中有着不同类型的用户,每个用户都从不同的角度以各自的观点看待数据库,从而形成了DBS不同的视图结构。因此DBS的结构可以有多种不同的层次或不同的视角。
从DBA角度审视数据库系统,其内部基本遵循美国 ANSI/SPAPRC
DBMS研究组提出的三体系结构(用户、概念级和物理级)。各个DBMS产品在体系结构上通常具有相同的特征(三级模式结构),并提供两层映像功能。DBS三模式结构是指 模式(Schema)、外模式(External Schema)和 内模式(Internal Schema)。
graph LRA(数据库) --> B(内模式)B --内模式/模式映像--> C(模式)C --> C1(外模式1)C --外模式/模式映像--> C2(外模式2)C --> C3(外模式3)C1 --> D1(应用1)C1 --> D2(应用2)C2 --> D3(应用3)C2 --> D4(应用4)C3 --> D5(应用5)C3 --> D6(应用6)
外模式的描述向客户提供数据,内模式的描述存储数据,模式是两者的中间层,机不涉及数据的物理存储和硬件环境,也与具体应用程序、开发工具及设计语言无关。
DBA必须考虑整个数据库的全局概念视图,它不包含任何的数据库实现细节,如何种D是BMS、文件组织、存取方法及设备特征等;而是定义数据库的逻辑结构、数据之间的联系,及数据相关的安全性、完整性等要求(由DBMS提供模式描述语言(Schema DDL)),同时一个数据库只有有个模式,且相对稳定。
外模式是保证数据库安全的重要措施,每个用户只能看见和访问所对应的外模式中的数据,简化了DBS的用户接口,便于用户使用,并有效支持数据独立性和共享性。
内模式也称存储模式(Storage Schema), 是对数据库中的物理结构和存储方式的描述,是数据在数据库内部的表现形式。是整个数据库的最底层表示,它不同于物理层,是DBA所见到的,特定的DBMS所处理的数据库的内部结构(内部视图或存储视图)。
总体而言,三个模式的对数据的三级抽象,其特点如下:
映像是指一种对应规则,指出映像双方如何进行转换。
因此,两层映像保证了DBS中的数据具有较高的逻辑独立性和物理独立性,使数据的定义和描述可以从应用程序中分离,简化数据库应用程序的开发,减少维护工作量。
在DBMS中,DB的使用者(程序员,DBA等)可以使用命令行客户端、图形化界面管理工具、应用程序等连接DBMS,通过DBMS查询和处理存储在底层数据库中的各种数据。 这种工作模式就是客户/服务器结构(Client/Server,C/S).
此结构基于Web应用的客户/服务器结构,或者三层客户/服务器结构。
在DBS中,它将与DBMS交互的客户端进一步细分为表示层
和处理层
。
表示层:指数据库使用者的操作和展示界面,通常由各种浏览器构成
处理层(中间层):负责处理数据库使用者的具体应用逻辑,与后台的DBMS共同组成功能丰富的胖服务器
。
这种工作模式就是浏览器/服务器结构(Browser/Server,B/S)
模型是现实世界特征的模拟和抽象表达,帮助人们更好的认识和理解客观事物、对象和过程等感兴趣的内容(飞机航模、建筑图纸、军事沙盘等)。而数据模型是用来模拟和抽象现实世界中的数据特征,描述的是数据的共性内容。
数据具有静态和动态两种特征。
静态特征:数据的基本结构、数据间的联系及对数据取值范围的约束。
动态特征:指对数据可以进行符合一定规则的操作。
数据模型通常由数据结构、数据操作和数据约束三要素组成:
数据模型应满足三个要求:
目前一种数据模型要完全满足三个要求,很困难,因此需针对不同对象和应用,采取逐步抽象的方法,在不同抽象层使用不同的数据模型。
概念层是数据抽象级别的最高层,目的是按照用户的观点对世界建模。概念层模型用来描述现实世界的事物,是对信息世界建模,与具体的计算机系统无关,独立于任何DBMS,容易向DBMS所支持的逻辑数据库模型转换,此类模型主要用于数据库的设计阶段,表示现实世界的各个事物及其联系。
概念模型用于信息世界的建模,是现实世界到信息世界的第一层抽象,是数据库设计人员进行数据库设计的有力工具,是设计人员和用户之间交流的语言,因此概念模型具有较强的语义表达能力,能够方便、直接地表达应用中的各种语义知识,它简单、清晰、易于理解。
数据模型中有型【type】
(某一类数据的结构和属性说明)和值【value】
(对型的赋值)的概念
概念模型的表示方法有很多种,最常用的是实体-联系方法(Entity-Relationship approach)也称E-R模型,它是抽象和描述现实世界的有力工具,它独立于具体的DBMS所支持的逻辑模型,是各种逻辑模型的共同基础。
逻辑层是数据抽象的中间层,描述数据整体逻辑结构;这层的数据抽象被称为逻辑模型,是用户通过DBMS看到的现实世界,基于计算机系统的观点来对数据进行建模和表示。因此,它既要让用户易于理解,又要便于DBMS实现。
主要的逻辑数据模型有 层次模型(Hierarchical)、网站模型(Network Model)、关系模型(Relational Model)和面向对象模型(Object Oriented Model)等
此模型是数据库最早的一种数据模型,它的数据结构是一颗“有向树”,数的每个结点对应一个记录集。特点:有且仅有一个结点没有父结点(根结点);其他结点有且仅有一个父结点。
此模型以网状结构表示实体与实体之间的联系。是层次模型的扩展,允许结点又多个父结点,且可以有多个节点没有父结点。此模型可以方便的表示实体间各种类型的联系,但结构复杂,实现的算法难以规范化。
此模型用二维表结构来表示实体及实体间联系的模型,并以二维表格的形式组织数据库中的数据。
特点:
此模型是面向对象方法与数据库相结合所构成的数据模型。它既是概念模型又是逻辑模型。用面向对象观点描述现实世界实体逻辑组织、对象间的联系。
此模型又叫数据的物理模型,描述数据在存储介质上的组织结构,是逻辑模型的物理实现,每一种逻辑模型在实现时都有与其对应的物理模型。物理模型是数据库最底层的抽象,它确定数据的物理存储结构、数据存取路径及调整、优化数据库的性能。
物理数据结构一般向用户屏蔽,用户不必了解其细节。