目前数据库可分为关系型数据库和非关系型数据库(NoSQL)两类,在了解两类数据库之前,先回顾一下数据库四类数据模型
数据模型
数据模型是一个描述数据、数据联系、数据语义以及一致性约束的概念工具集合,提供了一种描述物理层、逻辑层以及视图层数据库设计的方式。可被划分为四类:
关系模型(relational model)
- 用表的集合表示数据和数据间的关系,每个表有多个列,每列有唯一的列表
- 基于记录(数据库由若干固定格式的记录构成),每个表包含某种特定类型的记录,每个记录类型定义了固定数目字段/属性,由表的每列对应每个属性
实体-联系模型 (E-R model)
基于 现实世界由一组称为实体的基本对象以及这些对象间的联系构成 这一认识
基于对象的数据模型(Object-based data model)
可看作 E-R模型+封装、方法(函数)和对象标识等扩展概念
半结构化数据模型(semistructured data model)
允许相同类型的数据项含有不同的属性集,一般使用可扩展标记语言XML表示
关系型数据库
基于关系模型,即由多张能互相联接的二维行列表组成的数据库,
当前主流的关系型数据库有Oracle、DB2、PostgreSQL、Microsoft SQL Server、Microsoft Access、MySQL、浪潮K-DB等
多数商用关系数据库系统使用SQL语言
结构&基本术语
关系数据库由表(table)的集合构成,每个表都有唯一的名字,用关系指代;
表中的每一行代表一组值之间的联系,即一个n元组(n-tuple),而每一列对应一个属性(attribute);
即一个表(关系)是多个元组的集合,而每个元组都具有固定的属性
对于关系的每个属性,都存在一个允许取值集合,称为域(domain)
在一个关系中,唯一标识一个元组的一个/多个属性的集合,称为超码(superkey),最小超码被称为候选码(candidate key),被设计者选中、主要用来在一个关系中区分不同元组的候选码被称为主码(primary key)
SQL标准特征
SQL(结构化查询语言)是关系型数据库最为常用/标准的查询语言,包括数据定义语言(DDL)、数据操纵语言(DML)、完整性、视图定义、事务控制、嵌入式SQL、动态SQL、授权几个部分。(详情不予介绍)
SQL各种实现可能在一些细节上有所不同,或者只支持整个语言的一个子集,大多数实现还支持一些非标准特征。
MySQL
最流行的关系型数据库管理系统之一,被认为是WEB应用方面最好的关系数据库管理系统应用软件。
主要系统特性
- 使用C/C++编写,保证源代码可移植性,支持多种操作系统(AIX、Linux、Mac OS、Windows等),并为多种编程语言(C/C++、Python、Java、PHP等)提供API
- 支持多线程并采用优化的SQL查询算法
- 既能作为单独的应用程序,也能作为一个库嵌入其它软件中
- 提供TCP/IP、ODBC和JDBC等多种数据库连接途径
PHP连接
在PHP中,通过 mysql_connect() 函数连接数据库
mysql_connect(server,user,pwd,newlink,clientflag);
参数 | 描述 |
---|---|
server | 可选,规定要连接的服务器,可包括端口号,默认为 “localhost:3306”。 |
user | 可选,规定登录所使用的用户名,默认值为拥有服务器进程的用户的名称。 |
pwd | 可选,规定登录所用的密码,默认是为""。 |
newlink | 可选,默认情况下如果用同样的参数第二次调用 mysql_connect(),将不会建立新连接,而将返回已经打开的连接标识,参数 new_link 会改变此行为并使 mysql_connect() 总是打开新的连接,甚至当 mysql_connect() 曾在前面被用同样的参数调用过。 |
clientflag | 可选,client_flags 参数可以是以下常量的组合: MYSQL_CLIENT_SSL 使用 SSL 加密 MYSQL_CLIENT_COMPRESS 使用压缩协议 MYSQL_CLIENT_IGNORE_SPACE 允许函数名后的间隔 MYSQL_CLIENT_INTERACTIVE 允许关闭连接之前的交互超时非活动时间 |
成功则返回一个MySQL连接标识,失败则返回FALSE
代码示例
<?php
$con = mysql_connect("localhost","mysql_user","mysql_pwd");
if (!$con)
{
die('Could not connect: ' . mysql_error());
}
// operation code 一般使用
mysql_close($con);
?>
其他函数
mysql_pconnect(server,user,pwd,clientflag) //打开一个到MySQL服务器的持久连接(优先返回已打开的持久连接;mysql_close() 不会关闭该连接)
mysql_query(query,connection) //执行MySQL查询语句query(不以分号结束),connection可选,默认上一个打开连接
mysql_select_db(database,connection) //设置活动数据库database,connection可选,默认上一个打开连接
mysql_close(link_identifier) //关闭非持久连接
Java连接(JDBC)
可使用JDBC(Java DataBase Connectivity,java数据库连接)进行连接,JDBC是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。
Java连接MySQL需要驱动包,解压后得到jar库文件,然后在对应项目中导入该库文件。
示例代码如下(数据库RUNOOB、表websites、属性id/name/url)
package com.runoob.test;
import java.sql.*;
public class MySQLDemo {
// JDBC 驱动名及数据库 URL
static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";
static final String DB_URL = "jdbc:mysql://localhost:3306/RUNOOB";
// 数据库的用户名与密码,需要根据自己的设置
static final String USER = "root";
static final String PASS = "123456";
public static void main(String[] args) {
Connection conn = null;
Statement stmt = null;
try{
// 注册 JDBC 驱动(加载驱动)
Class.forName("com.mysql.jdbc.Driver");
// 打开链接(连接数据库)
System.out.println("连接数据库...");
conn = DriverManager.getConnection(DB_URL,USER,PASS);
// 执行查询
System.out.println(" 实例化Statement对象...");
stmt = conn.createStatement();
String sql;
sql = "SELECT id, name, url FROM websites";
// ResultSet类,用来存放获取的结果集
ResultSet rs = stmt.executeQuery(sql);
// 展开结果集数据库
while(rs.next()){
// 通过字段检索
int id = rs.getInt("id");
String name = rs.getString("name");
String url = rs.getString("url");
// 输出数据
System.out.print("ID: " + id);
System.out.print(", 站点名称: " + name);
System.out.print(", 站点 URL: " + url);
System.out.print("\n");
}
// 完成后关闭
rs.close();
stmt.close();
conn.close();
}catch(SQLException se){
// 处理 JDBC 错误
se.printStackTrace();
}catch(Exception e){
// 处理 Class.forName 错误
e.printStackTrace();
}finally{
// 关闭资源
try{
if(stmt!=null) stmt.close();
}catch(SQLException se2){
}// 什么都不做
try{
if(conn!=null) conn.close();
}catch(SQLException se){
se.printStackTrace();
}
}
System.out.println("Goodbye!");
}
}
SQL Server
SQL Server是由Microsoft开发和推广的关系数据库管理系统(DBMS),是真正的客户机/服务器体系结构,具有图形化用户界面、丰富的编程接口工具、支持Web技术且提供数据仓库功能,SQL Server 2000之后还支持XML扩展标记语言、分布式分区视图、Web分析等特性,相比于MySQL,SQL Server界面友好、操作更容易、与其他数据库(Access、FoxPro、Excel等)有良好接口。
PHP连接
以wampserver(不支持sqlserver连接)+sqlserver为例
驱动版本 | PHP版本 |
---|---|
3.2 | 5.6、5.5和5.4 |
3.1 | 5.5和5.4 |
3.0 | 5.4 |
- 打开下载文件(.exe),释放各版本dll文件
- 选择与php版本适应的驱动文件(例,5.4版本,php_pdo_sqlsrv_54_ts.dll、php_sqlsrv_54_ts.dll),复制到wampserver安装目录的/ext文件夹下
- 配置php.ini文件(同时配置php和apache两个目录下的php.ini文件),开启扩展
在Windows Extensions/extension注释后加上代码
extension=php_pdo_sqlsrv_55_ts.dll
extension=php_sqlsrv_55_ts.dll
- 重启apache,利用sqlsrv_connect函数连接数据库
相关函数
sqlsrv_connect( string $serverName [, array $connectionInfo])
返回一个PHP连接资源或false
示例代码1
<?php
$conn = sqlsrv_connect('localhost', array('Database' => 'test', 'UID' => 'sa' , 'PWD' => 'PS0001!'));
var_dump(sqlsrv_errors());
示例代码2
<?php
$serverName = "localhost"; //数据库服务器地址
$uid = "sa"; //数据库用户名
$pwd = "1234"; //数据库密码
$connectionInfo = array("UID"=>$uid, "PWD"=>$pwd, "Database"=>"test");
$conn = sqlsrv_connect($serverName, $connectionInfo);
if( $conn == false)
{
echo "连接失败!";
var_dump(sqlsrv_errors());
exit;
}else{
echo "链接成功";
}
Java连接(JDBC)
配置SQL Server JDBC驱动
- 在官网下载Microsoft SQL Server JDBC 驱动程序
- 下载sqljdbc,解压后根据java版本选择相应驱动(jdk1.7以上为sqljdbc4X.jar;以下为sqljdbc.jar)放入适当位置
- 编辑环境变量CLASSPATH,追加jar文件地址
- 将jar文件拷贝至 C:\Program Files\Java\jdk1.7.0\jre\lib\ext 目录和C:\Program Files\Java\jre7\lib\ext目录下
使用Eclipse对SQL Server数据库进行操作
- 在Eclipse中新建一个java项目,在src中选择构建路径(Build Path)->配置构建路径(Configure Build Path),在打开的窗口的右边选择“库”(Libraries) ,添加外部JAR( Add External JARs),找到 sqljdbc42.jar 文件并打开, 完成构建路径的配置
- 代码示例
packagepkg;
importjava.sql.*;
public class Main {
Connection con;
Statement st;
publicstatic void main(String [] args)
{
StringdriverName=”com.microsoft.sqlserv er.jdbc.SQLServerDriver”;
StringdbURL=”jdbc:sqlserver://localhost:1433;DatabaseName=XXX”; //数据库名 (url自定)
String userName=”XXX”; //用户名
String userPwd=”XXX”; //密码
String sql=“XXX”; //SQL语句
try
{
Class.forName(driverName); //jdk版本6.0以上可以省略这句话
con=DriverManager.getConnection(dbURL,userName,userPwd);
st=con.createStatement();
st.executeUpdate(sql);
}catch(Exception e)
{
e.printStackTrace();
}
}
}
详见从零开始的java连接sqlserver数据库教程 By saiofo
非关系型数据库
非关系型数据库,又被称为NoSQL(Not Only SQL ),意为不仅仅是SQL( Structured QueryLanguage,结构化查询语言)。
NoSQL描述的是大量结构化数据存储方法的集合,其产生就是为了解决(超)大规模数据集合多重数据种类带来的挑战,尤其是大数据应用难题。
NoSQL具有扩展简单、高并发、高稳定性、成本低廉等优势但同时也存在暂不支持SQL、成熟度低、数据完整性难以保证等不足之处。
根据结构化方法以及应用场合的不同,主要可以将NoSQL分为以下四类:
面向检索的列式存储/列存储数据库
面向检索的列式存储(Column-Oriented),采用列式存储结构,同于关系型数据库的行式结构,这种结构会让很多统计聚合操作更简单方便,使系统具有较高的可扩展性。
这类数据库还可以适应海量数据的增加以及数据结构的变化,这个特点与云计算所需的相关需求是相符合的,比如GoogleAppengine的BigTable以及相同设计理念的Hadoop子系统HaBase就是这类的典型代表。
需要特别指出的是,Big Table特别适用于MapReduce处理,这对于云计算的发展有很高的适应性。
面向高性能并发读写的缓存存储/键值存储数据库
面向高性能并发读/写的缓存存储(Key-Value),其结构类似于数据结构中的Hash表,每个Key分别对应一个Value,能够提供非常快的查询速度、大数据存放量和高并发操作,适合通过主键对数据进行查询和修改等操作。
Key-Value数据库的主要特点是具有极高的并发读/写性能,非常适合作为缓存系统使用,但数据无结构化,通常只被当作字符串或者二进制数据。
Key-Value数据库的代表有MemcacheDB、BerkeleyDB、Redis、Flare
面向海量数据访问的文档存储/文档型数据库
面向海量数据访问的文档存储(Document-Oriented),这类存储的结构与Key-Value非常相似,也是每个Key分别对应一个Value,但是这个Value主要以JSON(JavaScriptObjectNotations)或者XML等格式的文档来进行存储。
这种存储方式可以很方便地被面向对象的语言所使用。这类数据库可在海量的数据中快速查询数据,通常用于Web应用,典型代表为MongoDB、CouchDB等
图形数据库
图形结构的数据库同其他行列以及刚性结构的SQL数据库不同,它是使用灵活的图形模型,并且能够扩展到多个服务器上。
可利用图结构相关算法(最短路径寻址、N度关系查栈等)但很多时候需要对整个图做计算才能得出需要的信息,而且这种结构不太好做分布式的集群方案。
适合社交网络、推荐系统等应用场景
共同特征
- 无需预定义模式:不需要事先定义数据模式(预定义表结构)。数据中的每条记录都可能有不同的属性和格式。当插入数据时,并不需要预先定义它们的模式。
- 无共享架构:相对于将所有数据存储的存储区域网络中的全共享架构。NoSQL往往将数据划分后存储在各个本地服务器上。因为从本地磁盘读取数据的性能往往好于通过网络传输读取数据的性能,从而提高了系统的性能。
- 弹性可扩展:可以在系统运行的时候,动态增加或者删除结点。不需要停机维护,数据可以自动迁移。
- 分区:相对于将数据存放于同一个节点,NoSQL数据库需要将数据进行分区,将记录分散在多个节点上面。并且通常分区的同时还要做复制。这样既提高了并行性能,又能保证没有单点失效的问题。
- 异步复制:和RAID存储系统不同的是,NoSQL中的复制,往往是基于日志的异步复制。这样,数据就可以尽快地写入一个节点,而不会被网络传输引起迟延。缺点是并不总是能保证一致性,这样的方式在出现故障的时候,可能会丢失少量的数据。
- BASE:相对于事务严格的ACID特性,NoSQL数据库保证的是BASE特性。BASE是最终一致性和软事务
(BASE支持的是大型分布式系统,提出通过牺牲强一致性获得高可用性,详见CAP原则、BASE理论
CAP原则、一致性模型、BASE理论和ACID)
MongoDB
MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写,旨在为 WEB 应用提供可扩展的高性能数据存储解决方案
主要特征
- MongoDB 将数据存储为一个文档,数据结构由键值(key->value)对组成,且可以在记录中设置任何属性的索引
- Mongo支持丰富的查询表达式,查询指令使用JSON形式的标记,可轻易查询文档中内嵌的对象及数组
- MongoDb 使用update()命令实现替换完成的文档(数据)或者一些指定的数据字段;使用Map/reduce函数(由Javascript编写,可通过db.runCommand或mapreduce命令来执行)来对数据进行批量处理和聚合操作
- MongoDB允许在服务端执行脚本,可以用Javascript编写某个函数,直接在服务端执行,也可以把函数的定义存储在服务端,下次直接调用即可
- MongoDB支持各种编程语言(RUBY,PYTHON,JAVA,C++,PHP,C#等)
附录:各平台MongoDB的安装
PHP连接
需要事先安装mongodb php驱动 附录:PHP7 MongDB
连接数据库,代码示例
<?php
$m = new MongoClient(); // 以url作为参数,默认为mongodb://localhost:27017
$db = $m->test; // 获取名称为 "test" 的数据库
?>
$collection = $db->createCollection("runoob"); //创建集合
$document = array(
"title" => "MongoDB",
"description" => "database",
"likes" => 100,
"url" => "http://www.runoob.com/mongodb/",
"by", "XXX"
);
$collection->insert($document); //插入文档
$cursor = $collection->find();
foreach ($cursor as $document) { // 迭代显示文档标题
echo $document["title"] . "\n";
}
$collection->update(array("title"=>"MongoDB"), array('$set'=>array("title"=>"MongoDB Update"))); // 更新文档
$collection->remove(array("title"=>"MongoDB Update"), array("justOne" => true)); // 删除文档
Java连接
环境配置( MongoDB JDBC 驱动)
- 下载mongo jar包(最新版本),备用地址
- 设置环境变量CLASSPATH(Java项目驱动包加载加上文)
代码示例
无需用户名和密码
import com.mongodb.MongoClient;
import com.mongodb.client.MongoDatabase;
public class MongoDBJDBC{
public static void main( String args[] ){
try{
MongoClient mongoClient = new MongoClient( "localhost" , 27017 ); // 连接到 mongodb 服务
MongoDatabase mongoDatabase = mongoClient.getDatabase("mycol"); // 连接到/选择数据库(不存在则自动创建)
System.out.println("Connect to database successfully");
}catch(Exception e){
System.err.println( e.getClass().getName() + ": " + e.getMessage() );
}
}
}
需要用户名、密码验证
import java.util.ArrayList;
import java.util.List;
import com.mongodb.MongoClient;
import com.mongodb.MongoCredential;
import com.mongodb.ServerAddress;
import com.mongodb.client.MongoDatabase;
public class MongoDBJDBC {
public static void main(String[] args){
try {
//连接到MongoDB服务 如果是远程连接可以替换“localhost”为服务器所在IP地址
ServerAddress serverAddress = new ServerAddress("localhost",27017); // 服务器地址 和 端口
List<ServerAddress> addrs = new ArrayList<ServerAddress>();
addrs.add(serverAddress);
MongoCredential credential = MongoCredential.createScramSha1Credential("username", "databaseName", "password".toCharArray()); //用户名 数据库名称 密码
List<MongoCredential> credentials = new ArrayList<MongoCredential>();
credentials.add(credential);
MongoClient mongoClient = new MongoClient(addrs,credentials); //通过连接认证获取MongoDB连接
MongoDatabase mongoDatabase = mongoClient.getDatabase("databaseName"); //连接到/选择数据库
System.out.println("Connect to database successfully");
} catch (Exception e) {
System.err.println( e.getClass().getName() + ": " + e.getMessage() );
}
}
}
附录:详细介绍及其他操作