系统架构设计师 6:数据库设计

news2024/11/16 13:56:32

一、数据库系统

数据库系统(DataBase System, DBS)是一个采用了数据库技术,有组织地、动态地存储大量相关联数据,从而方便多用户访问的计算机系统。广义上讲,DBS包括了数据库管理系统(DBMS)。

数据库(DataBase, DB)是统一管理的、长期储存在计算机内的,有组织的相关数据的集合。

DBMS实现了对共享数据有效地组织、管理和存取。DBMS功能主要包括:

1. 数据定义。

    提供数据定义语言(DDL),可以对数据库的结构进行描述。

2. 数据库操作。

    向用户提供数据操纵语言(DML),实现对数据库中数据的增删改查。

3. 数据库运行管理。

    包括多用户环境下的并发控制、安全性检查和存取控制、完整性检查和执行、运行日志的组织管理、事务管理和自动恢复等。

4. 数据组织、存储和管理。

    包括数据字典、用户数据和存取路径等。

5. 数据库的建立和维护。

    包括数据库的初始建立、数据的转换、数据库的转储和恢复、数据库的重组和重构、性能监测和分析等。

从数据库管理系统的角度,数据库分为三级模式:

1. 外模式。

2. 概念模式。

3. 内模式。

二、关系数据库

(不是很懂你们数学好的人)

关系的描述称为关系模式,可以形式化地表示为:

    R(U, D, dom, F)

其中,R表示关系名;U是组成该关系的属性名集合;D是属性的域;dom是属性向域的映像集合;F为属性间数据的依赖关系集合。

通常将关系模式简记为:

    R(U)或R(A1, A2, A3, ..., An)

其中,R为关系名,A1, A2, A3, ..., An为属性名或域名。

三、数据库设计

数据库设计属于系统设计的范畴。通常把使用数据库的系统统称为数据库应用系统,把对数据库应用系统的设计简称为数据库设计。

一般将数据库设计分为如下六个阶段:

1. 用户需求分析。

    综合各个用户的应用需求,对现实世界要处理的对象(组织、部门和企业等)进行详细调查,在了解现行系统的概况,确定新系统功能的过程中,收集支持系统目标的基础数据及处理方法。

2. 概念结构设计。

    目标是产生反映系统信息需求的数据库概念结构。

    描述概念模型的较理想的工具是E-R图。

3. 逻辑结构设计。

    主要工作步骤包括确定数据模型(如关系模型)、将E-R图转换成指定的数据模型(如关系模式)、确定完整性约束和确定用户视图(根据用户类别确定不同用户使用的视图)。

4. 物理结构设计。

    主要工作步骤包括确定数据分布(集中管理还是分布式管理?)、存储结构(B+树等)和访问方式(建立索引)。

5. 数据库实施。

    根据逻辑和物理设计的结果,在计算机上建立起实际的数据库结构,数据加载,进行试运行和评价的过程,叫作数据库的实施。

6. 数据库运行和维护。

    主要内容包括对数据库性能的监测和改善、故障恢复、数据库的重组和重构。

四、应用程序与数据库的交互

在应用系统中,需要高级程序语言来完成与用户之间的交互,用户不能直接访问后台的数据库,因此数据库管理系统需要提供程序级别的接口来访问数据。

常见应用程序与数据库的数据交互方式有库函数、嵌入式SQL、通用数据接口标准和对象关系映射(Object Relational Mapping, ORM)。

1 库函数

库函数级别的数据访问接口往往是数据库提供的最底层的高级程序语言访问数据接口,如Oracle数据库的Oracle Call Interface(OCI)。

OCI包含了连接数据库、调用SQL和事务控制等函数,开发者可以使用高级程序语言编写程序调用OCI库函数,实现对数据库的访问。

2 嵌入式SQL

嵌入式SQL是一种将SQL语句直接写入某些高级程序语言,如C、COBOL、Java等编程语言的源代码中的方法。借此方法,可使得应用程序拥有了访问数据以及处理数据的能力。

数据库厂商一般会提供一个嵌入式SQL的预编译器,把包含有嵌入式SQL的宿主语言源码转换成纯宿主语言的代码。这样一来,源码即可使用宿主语言对应的编译器进行编译。通常情况下,经过嵌入式SQL的预编译之后,原有的嵌入式SQL会被转换成一系列函数调用,因此,数据库厂商还需要提供一系列函数库,以确保链接器能够把代码中的函数调用与对应的实现链接起来。

3 通用数据接口标准

开放数据库连接(Open DataBase Connectivity, ODBC)是为了解决异构数据库间的数据共享而产生的。

一个基于ODBC的应用程序对数据库进行操作时,用户直接将SQL语句传送给ODBC,所有的数据库操作由对应的DBMS的ODBC驱动程序完成,由对应DBMS的ODBC驱动程序对DBMS进行操作。也就是说,不论哪种数据库系统,均可用ODBC API进行访问。

ODBC的最大优点就是能以统一的方式处理所有的关系数据库。

在具体操作时,首先必须用ODBC管理器注册一个数据源,管理器根据数据源提供的数据库位置、数据库类型及ODBC驱动程序等信息,建立起ODBC与具体数据库的联系。这样,只要应用程序将数据源名提供给ODBC,ODBC就能建立起与相应数据库的连接。

4 对象关系映射(ORM)

ORM是一种程序设计技术,用于实现面向对象编程语言里不同类型系统数据之间的转换。

ORM是通过使用描述对象和数据库之间映射的元数据,将程序中的对象与关系型数据库相互映射;ORM可以解决数据库与程序间的异构性。

ORM是一种将内存中的对象保存到关系型数据库中的技术,主要负责实体域对象的持久化,封装数据库访问细节,提供了实现持久化层的另一种模式,采用映射元数据(XML)来描述对象-关系的映射细节,使得ORM中间件能在任何一个应用的业务逻辑层和数据库之间充当桥梁。

五、NoSQL数据库

NoSQL泛指非关系型的数据库,区别于关系型数据库,它们不保证关系数据的ACID特性。

按照所使用的数据结构的类型,一般可以将NoSQL数据库分为以下四种类型:

1. 列式存储数据库。

    Cassandra、HBase、Riak。

2. 键值对存储数据库。

    Tokyo Cabinet/Tyrant、Redis、Voldemort、Oracle BDB。

3. 文档型数据库。

    CouchDB、MongoDb、SequoiaDB。

4. 图数据库。

    Neo4J、InfoGrid、InfiniteGraph。

NoSQL整体框架分为四层:

1. 数据持久层。

    定义了数据的存储形式,主要包括基于内存、硬盘、内存和硬盘接口、定制可插拔四种形式。

2. 数据分布层。

    定义了数据是如何分布的,主要有三种形式:CAP支持、多数据中心支持、动态部署支持。

3. 数据逻辑层。

    表述了数据的逻辑表现形式。

4. 接口层。

    为上层应用提供了方便的数据调用接口,提供了五种选择:Rest、Thrift、Map/Reduce、Get/Put、特定语言API。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/700770.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

详细认识二叉树【图片+代码】

目录 一、树的概念及结构 1.1树的概念 1.2树的相关概念 1.3树的表示 1.4树在实际中的应用(目录树) 二、二叉树概念及结构 2.1概念 2.2特殊的二叉树 2.3二叉树的性质 2.4二叉树存储结构 三、二叉树的顺序结构及实现 3.1二叉树的顺序结构 3…

Redis6之集群

集群,就是通过增加服务器的数量,提供相同的服务,从而让服务器达到一个稳定、高效的状态 必要性 单个redis存在不稳定性。当redis服务宕机了,就没有可用的服务了。而且单个redis的读写能力是有限的。使用redis集群可以强化redis的…

PIL.Image 调色板模式处理标签数据

文章目录 1 使用PIL.Image库进行调色板模式2 转回原来的色彩3 效果参考 1 使用PIL.Image库进行调色板模式 基本步骤: 自定义调色板,数据格式是一个Nx3的二维数组,一维数组的位置为分类的下标数据类型为np.uint8转化为调色板模式后img.conve…

想知道音频怎么转文字吗?

随着数字化技术的不断发展,我们生活中产生的各种音频越来越多,例如会议录音、采访录音等等。虽然音频记录信息方便,但它们在信息处理、存储和分享方面也存在问题。比如当我们需要对音频中的内容进行编辑或整理时,手动打字出现漏字…

Eclipse中项目的配置

1、修改本地运行时Tomcat对应的JRE版本 老项目升级JDK,在eclipse修改了项目的jdk、编译等级,但还是启动失败,报“java.lang.UnsupportedClassVersionError”。 观察发现,启动日志,tomcat还是使用的jdk1.5,…

编程题分享:有⼀堆糖果,其数量为n,现将糖果分成不同数量的堆数

背景 近期面试遇到一家公司的编程题,觉得挺有参考价值 此处使用 PHP语言,进行编码测试, 编码之前要进行思路分析,避免无头苍蝇,走一步看一步 最后,希望后期面试顺利!欢迎指摘 . 题目&#xff1…

形态学操作之膨胀

note // 膨胀原理:操作过程中,若膨胀因子某点是1,且原图该点为1,则锚点位置为1 code // 膨胀 // 膨胀原理:操作过程中,若膨胀因子某点是1,且原图该点为1,则锚点位置为1 typedef e…

gma 2 教程(一)概述:1.GMA 简介

地理与气象分析库(Geographic and Meteorological Analysis. gma),是一个基于 Python 的地理、气象数据快速处理分析和地理制图函数包。构建过程参考了ArcGIS和QGIS的操作逻辑和特点,并添加诸多独创性、独有的功能,具有…

QT Creator上位机学习(三)QString及其相关控件介绍

系列文章目录 文章目录 系列文章目录字符串QStringQLableQLineEditQString的常用功能 字符串QString QSting类,用于处理字符串,进行字符串和数字之间的转化 转换函数: //字符串转数字 QString str......; int numstr.toInt(); float num2s…

微信项目IO优化:Jetpack DataStore 与MMKV实现高效持久化

咱们一起来看看mmkv 腾讯微信团队于2018年9月底宣布开源 MMKV ,原理上基于 mmap的一个高性能key-value 组件,数据的序列化/反序列化使用 protobuf 实现,主打高性能和稳定性,也支持了Android 平台。 **MMKV最新源码托管地址&#…

Mybatis【核心配置文件说明】

配置解析 1、核心配置文件 mybatis-config.xml 注意: 在配置 mybatis-config.xml 时,要注意标签的顺序: 2、环境变量(environments) MyBatis 可以配置成适应多种环境 不过要记住:尽管可以配置多个环境…

现代操作系统(下)

第六章 死锁 在计算机系统中有很多独占性的资源,在任一时刻它们都只能被一个进程使用。两个进程同时使用同一文件系统表中的表项会引起文件系统的瘫痪。正因为如此,操作系统都具有授权一个进程(临时)排他地访问某一种资源的能力。…

【AcWing】夏季每日一题2023 -- 4382. 快速打字 -- Java Version

题目链接:https://www.acwing.com/problem/content/4385/ 1. 题解(4382. 快速打字) y总视频讲解:https://www.acwing.com/video/4743/ 类似题目:AcWing 2816. 判断子序列 1.1 双指针:判断子序列 ⭐ 时间复…

一文吃透MAUI、WinUI3和WPF的优势及劣势

引言: 在应用程序开发领域,选择合适的框架对于开发人员和业务来说至关重要。本文将比较并对比三个流行的用户界面框架:MAUI(Multi-platform App UI)、WinUI 3和WPF(Windows Presentation Foundation&#x…

element ui table表格(表头、表体)样式

效果图如下 1.表头样式:header-cell-stayle 2.表体样式 在methods中写 在style中

使用Qt/C++实现WGS84、高德GCJ-02、百度BD-09坐标系间相互转化

在做地图相关开发时候,绕不开不同坐标系间的转化,因此我根据查阅相关资料后将不同坐标系间的转换封装到一个GeoTranslate类中,该类转换函数不仅支持Qt/C调用,同时可在QML中直接调用,配合上QML/Map很方便,我…

大咖培训讲座|高性能计算专场 认识真正的高性能计算,探究如何成为高性能计算工程师 ...

猿代码科技高性能计算讲座原文——OpenBLAS创始人无保留分享 我们如何成为一个高性能计算的工程师,或者这种性能优化的这一部分的软件工程师。 我其实想了一下,这一部分的入门的基础其实没那么难。 就是更主要的话,我还是在于兴趣和自驱力…

idea自定义类注释以及方法注释,无警告

背景 idea:IntelliJ IDEA 2023.1.3 (Ultimate Edition) 效果 类 方法 正式:类 设置 代码 /** * author: 你的名字* date: ${DATE} on ${TIME}* desc: $NAME*/注意,请全部复制,空行也要,看设置截图选中部分 …

Jenkins定时执行JMeter脚本并查看测试报告实现

【整体思路】 通过Tomcat启动Jenkins服务,在Jenkins中创建自动化测试项目,项目配置中配置构建时执行的动作,配置构建后动作展示报告 【涉及软件及版本信息】 Tomcat版本:9.0.76 Jenkins版本:2.332.3(注…

ES批量上传数据 - Python操作ES

代码 # -*- coding: utf-8 -*- # Author : markadcimport randomfrom elasticsearch import Elasticsearch, helpersurl http://localhost:9200/ client Elasticsearch(url) index testsome [] for i in range(1, 10001):docu {uid: i, age: random.randint(1, 100)} …