分布式数据库
2026/7/2 7:54:36 网站建设 项目流程

问答题

NoSQL数据库分类与特点

分类相关产品应用场景数据模型优点缺点
列族数据库HBase分布式数据存储与管理采用列式存储,将同一列数据存储在一起可扩展性强,查找速度快,复杂性低功能局限,不支持事务的强一致性
文档数据库MongoDBWeb 应用,存储面向文档或类似半结构化的数据<key,value>,其中 value 表示 JSON 结构的文档数据结构灵活,可以根据 value 来构建索引缺乏统一的查询语法
键值数据库Redis缓存内容,如会话、配置文件、参数等;频繁读 / 写、拥有简单数据模型的应用<key,value>,通过散列表来实现扩展性好,灵活性好,大量操作时性能高数据无结构化,通常只被当作字符串或者二进制数据,只能通过键来查询值
图数据库Neo4j社交网络、推荐系统,专注于构建关系图谱图结构支持复杂的图形算法复杂性高,只能支持一定的数据规模

关系型数据库

关系型数据库是基于关系模型、以二维表存储数据,通过 SQL 操作、支持事务与数据完整性约束的数据库系统,表间依靠主键外键建立关联。遵循 ACID 事务,主流产品:MySQL、Oracle、SQL Server、PostgreSQL、SQLite。

关系型数据库的优缺点
优点
  1. 采用二维表结构,逻辑清晰,易于理解;

  2. 支持标准SQL,查询、操作简单通用;

  3. 完整性约束完善(主键、外键、唯一、非空等),数据准确性高;

  4. 事务满足ACID,强一致性,适合金融、交易等严谨业务;

  5. 支持多表关联复杂查询,数据关联能力强。

缺点
  1. Schema固定,无法灵活适配多变的半结构化、非结构化数据;

  2. 水平扩展困难,海量高并发场景扩容成本高;

  3. 海量数据读写性能较差,不适合超大规模大数据存储;

  4. 不擅长存储图片、视频、日志等非结构化数据。

分布式的数据管理有哪些优点?会产生什么问题?

一、优点
  1. 高扩展性:可横向增加节点,轻松承载海量数据与高并发请求。

  2. 高可用性:数据多副本存储,单个节点故障不导致整体服务瘫痪。

  3. 高性能:数据分散存储,读写请求分摊到多节点,提升处理速度。

  4. 低成本:使用普通廉价服务器集群,替代高端单机数据库。

  5. 容错性强:副本机制保障数据不会因硬件损坏丢失。

二、带来的问题
  1. 数据一致性难题:多节点数据同步延迟,难以保证实时强一致,出现数据不一致。

  2. 网络开销大:节点间通信、数据同步占用大量网络资源,易出现网络分区故障。

  3. 事务实现复杂:跨节点分布式事务难以保证ACID,实现难度高。

  4. 运维难度提升:节点数量多,监控、故障排查、数据迁移管理更复杂。

  5. 数据分片与均衡问题:需合理分片,容易出现节点数据冷热不均。

Hbase

1.进入hbase环境

cd /opt/hadoop/sbin/

初始化namenode:

hdfs namenode -format

启动hdfs

./start-all.sh

启动hbase

cd /opt/hbase/bin/ ./start-hbase.sh

连接hbase

./hbase shell

2.对表的增删改查

创建数据库表user,定义两个列族

create 'user','info1','info2'

查看数据库表

list

查看表结构信息

describe 'user'

要屏蔽该表才能对表进行删除

第一步:disable '表名'

第二步:drop '表名'

disable 'user' drop 'user'

要屏蔽该表才能对表进行修改

第一步:disable '表名'

第二步:alter'表名'

disable 'user' alter 'user'

判断表是否存在

exists '表名'

3.对数据的增删改查

put '表名','行键','列族:列','值'

put 'user','1234','info1:Name','zhangsan'

scan'表名'查看表的所有记录

scan 'user'

get'表名','行键' 查看行键下的所有记录

get 'user','1234'

get '表名','行键,'列族'来查看某个行键列族的记录

get 'user','1234','info1'

get '表名','行键','列族:列'来查看行键列族的某个列记录

get 'user','1234','info1:Name'

删数据

delete '表名','行键','列族:列'来删除某个记录

delete 'user','1234','info1:Name'

get查询是否删除成功

get 'user','1234','info1:Name'

deleteall ’表名','行键'来删除整行记录

deleteall'user','1234'

truncate'表名'来清空表所有的记录

truncate 'user'

更新数据

put '表名','行键','列族:列','值'(put重写一遍就是更新)

put 'user','1234','info1:Name','zhangsan'

查看是否更新成功

scan 'user'

查询行数

count 'user'

4.对命名空间的增删改查

创建

create_namespace 'ns1'

查看

list_namespace

alter_namespace'nsq'

school_db设置属性description= "学校数据库"

alter_namespace 'school_db', {METHOD => 'set', 'description' => '学校数据库'}

drop_namespace

MongoDB

1.进入MongoDB shell

(1)在指定目录下创建 mongodb 文件夹、其子文件夹 data、log 以及文件 mongodb.log

cd /home/ubuntu mkdir -p mongodb/data mkdir -p mongodb/log touch mongodb/log/mongodb.log

(2)执行mongod命令启动mongod服务

mongod --dbpath /home/ubuntu/mongodb/data --logpath /home/ubuntu/mongodb/log/mongodb.log --logappend --fork

(3)进入mongodb shell

mongosh

2.数据库与集合基础命令

切换/创建数据库,不存在自动创建

use test

查看当前数据库

db

展示所有数据库

show dbs

查看当前库下所有集合

show collections

3.增删改查

  1. 插入单条insertOne()

    db.user.insertOne({ name: "张三", age: 20, gender: "男", hobby: ["篮球", "游戏"] })
  2. 插入多条insertMany()

    db.user.insertMany([ { name: "李四", age: 22, gender: "女" }, { name: "王五", age: 19, gender: "男" } ])

db.user.find()
比较运算符
运算符含义
$gt大于
$gte大于等于
$lt小于
$lte小于等于
$ne不等于
$in匹配数组内任意值
$nin不匹配数组内任意值

查询年龄大于20

db.user.find({ age: { $gt: 20 } })

查询年龄18~22

db.user.find({ age: { $gte: 18, $lte: 22 } })

1.updateOne 更新匹配第一条
db.user.updateOne( { name: "张三" }, { $set: { age: 25, height: 175 } } )
2.updateMany 批量更新所有匹配文档
db.user.updateMany( { gender: "男" }, { $inc: { age: 1 } } )

1.deleteOne 删除匹配第一条
db.user.deleteOne({ name: "张三" })
2.deleteMany 批量删除
// 删除18岁以下用户 db.user.deleteMany({ age: { $lt: 18 } })

案例

  1. 查看所有数据库

  2. 使用一个叫做stu的数据库

  3. 在stu数据库下创建一个集合xg,并插入数据{name:’tom’}

  4. 查看集合xg中的全部数据

  5. 查看集合xg中的数据,只返回age大于20对应的数据。

    show dbs ​ use stu ​ db.xg.insertOne({name:'tom'}) ​ db.xg.find() ​ db.xg.find({age:{$gt:20}})

Redis

1.启动Redis服务

一个终端

redis-server

另一个终端

redis-cli

2.基本命令

1.使用set、hset设置键以及值

set key1 value1 hset hset1 hset1 hvalue1

2.使用type判断键的类型

type key1 type hset1

3.使用exists判断key是否存在

exists key1 exists hset1

4.使用del删除键

del key1 del hset1

Neo4j

1.开启Neo4j

sudo neo4j start

浏览器打开

localhost:7474

2.基本操作

create创建

1.创建节点

语法

create (n:label {key:value})

n是节点的变量名,label是节点的标签,key是属性的键,value是属性的值

create (p:person {name:'孙悟空',address:'花果山'})
2.创建多个结点
create (a:person {name:'猪八戒'}),(b:person {name:'沙僧',address:'流沙河'})
3.创建节点并建立关系
create (n1)-[r:REL_TYPE]->(n2)

REL_TYPE是关系

create (n:person {name:'杨戬'})-[r:师傅]->(m:person {name:'玉鼎真人'}) return type(r)

match查询

1.匹配节点
match (n:person) return n;
2.匹配关系
match (:person)-[r:师傅]->(:person) return r;

delete删除

1.删除节点
match (p:person {name:'杨戬'}) delete p;
2.删除关系
match (:person)-[r:师傅]->(:person) delete r;

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询