NoSQL数据库面试题及解析
1. 什么是NoSQL数据库?
NoSQL(Not Only SQL)是一种非关系型数据库,将数据以键值对(key-value)的形式存储,相比传统的关系型数据库,NoSQL数据库在处理大量数据和高并发访问时具有更好的性能和扩展性。
NoSQL数据库适用于需要处理海量数据、高并发读写和灵活的数据结构的场景,例如社交网络、物联网、移动应用和实时分析等。
2. NoSQL数据库的特点
2.1 高扩展性
NoSQL数据库能够轻松地扩展到多台机器上,通过数据分片和数据复制实现数据的水平扩展和高可用性。
2.2 高性能
NoSQL数据库采用了多种优化策略,例如内存计算、磁盘顺序写等,以提供高速的数据访问和查询性能。
2.3 灵活的数据模型
NoSQL数据库可以存储各种类型的数据,例如文档、图形、列族、键值对等,灵活适应不同的数据结构和数据访问模式。
2.4 无需事务的处理
NoSQL数据库通常采用最终一致性的策略,不支持关系型数据库中的事务处理,但可以通过其他方式保证数据的一致性。
3. NoSQL数据库的分类
根据数据模型和存储方式的不同,NoSQL数据库可以分为以下几类:
3.1 键值存储数据库
键值存储数据库将数据以键值对的形式存储,提供了快速的数据存取能力。例如Redis、Memcached等。
示例代码:
import redis
# 连接Redis数据库
r = redis.Redis(host='localhost', port=6379)
# 存储数据
r.set('name', 'Alice')
# 获取数据
name = r.get('name')
print(name)
3.2 文档数据库
文档数据库以类似JSON的文档格式存储数据,每个文档都有一个唯一的标识符。例如MongoDB、CouchDB等。
示例代码:
from pymongo import MongoClient
# 连接MongoDB数据库
client = MongoClient('mongodb://localhost:27017/')
# 获取数据库
db = client.test
# 获取集合
collection = db.students
# 插入文档
student = {
'name': 'Bob',
'age': 20,
'gender': 'male'
}
result = collection.insert_one(student)
# 查询文档
result = collection.find_one({'name': 'Bob'})
print(result)
3.3 列族数据库
列族数据库将数据以表的形式存储,每个表由多个列族组成,每个列族包含多列数据。例如HBase、Cassandra等。
示例代码:
from cassandra.cluster import Cluster
# 连接Cassandra数据库
cluster = Cluster(['localhost'])
session = cluster.connect()
# 创建键空间
session.execute("CREATE KEYSPACE test WITH replication = {'class':'SimpleStrategy', 'replication_factor':1}")
# 切换到键空间
session.set_keyspace('test')
# 创建表
session.execute("CREATE TABLE students (id UUID PRIMARY KEY, name text, age int)")
# 插入数据
session.execute("INSERT INTO students (id, name, age) VALUES (uuid(), 'Alice', 18)")
# 查询数据
result = session.execute("SELECT * FROM students")
for row in result:
print(row)
3.4 图形数据库
图形数据库以图的形式存储数据,使用顶点和边表示数据之间的关系。例如Neo4j、OrientDB等。
示例代码:
from py2neo import Graph, Node, Relationship
# 连接Neo4j数据库
graph = Graph("bolt://localhost:7687", auth=("neo4j", "password"))
# 创建节点
alice = Node("Person", name="Alice")
bob = Node("Person", name="Bob")
# 创建关系
friend = Relationship(alice, "FRIEND", bob)
# 添加节点和关系到图中
graph.create(alice | bob | friend)
# 查询节点
result = graph.run("MATCH (p:Person) RETURN p.name AS name")
for row in result: