关系型数据库的代表:MySQL / 非关系型数据库的代表:Redis
非关系型数据库包括:
关于公网访问:
数据库一般都是和自己的后端程序放在一个本地网络内的。
经过公网访问数据库是非常非常少见的需求。
即使是使用DBaaS,也要在内网中访问。
常用的数据库软件可以根据用途分为两大类:关系型数据库(RDBMS) 和 非关系型数据库(NoSQL)。下面是一些主流且常用的数据库软件:
| 数据库软件 | 简介 | 适用场景 |
| MySQL | 开源、轻量级,社区广泛使用 | 网站开发、电商、博客等 |
| PostgreSQL | 功能强大、支持复杂查询和事务 | 金融、科研、地理信息系统(GIS) |
| Oracle | 商业数据库领导者,安全性高 | 企业级系统、银行、政府部门 |
| SQL Server | 微软出品,集成度高 | Windows系统集成、企业信息系统 |
| SQLite | 嵌入式数据库,无需服务端 | 移动端App、IoT设备、轻量应用 |
| 数据库软件 | 类型 | 简介 | 适用场景 |
| MongoDB | 文档型 | JSON文档存储,灵活强大 | Web应用、日志、内容管理 |
| Redis | 键值型 | 内存数据库,高性能 | 缓存、排行榜、会话管理 |
| Cassandra | 列存储 | 可扩展性强,适合海量数据 | 分布式系统、大数据分析 |
| Elasticsearch | 搜索引擎 | 全文搜索与分析 | 日志检索、搜索功能实现 |
| Neo4j | 图数据库 | 处理复杂关系数据 | 社交网络、推荐系统、知识图谱 |
NoSQL的四种类型如下:
| 类型 | 代表数据库 | 用途示例 |
| 键值型(Key-Value) | Redis | 缓存、Session、分布式锁 |
| 文档型(Document) | MongoDB | 存储 JSON 文档,如用户资料、产品信息 |
| 列存储型(Column-family) | Cassandra、HBase | 大数据分析、日志系统 |
| 图数据库(Graph) | Neo4j | 社交网络、推荐系统、知识图谱 |
因为没有固定的结构,所以一般来说不用SQL语句(确认一下正确性),Couchbase是特例?
SQL (Structured Query Language)是结构化查询语言。
不同的【关系型数据库】软件很多都支持 SQL,但它们的语法在细节上存在差异。
SQL标准语法包括:CREATE / INSERT / SELECT / UPDATE / DELETE等。
关系型数据库的基础 SQL 类似,但高级功能差异大。
非关系型数据库:语法完全不同。
非关系型数据库有各自专属的查询语法,和 SQL 差别很大。
[AI]SQL 文件(通常以 .sql 作為副檔名)是一種純文字檔案,裡面主要包含 SQL(Structured Query Language,結構化查詢語言) 的指令,用來操作資料庫。
大多數情況下,.sql 文件裡面主要是 DDL(資料定義語言) 和 DML(資料操作語言) 的語句,例如 CREATE TABLE、INSERT、SELECT。這些語句偏重 聲明式(declarative),描述「要做什麼」,而不是「怎麼做」,所以邏輯表達有限。
如果資料庫支援擴展語言,那 .sql 文件裡面就能包含更多邏輯,但是还是邏輯表達能力有限,不如一般程式語言靈活。
Data Definition Language (ddl)
Data Manipulation Language (dml)
数据库一般都是有自己独立的用户 & 权限系统的。
TODO
Object-Relational Mapping
简单理解就是:在语言层级包装一下SQL语言(对接各种数据库),从而让程序员不需要再手写SQL语句(性能可能有一点损失?),只需要操作语言内原生的dict等数据容器即可
AI:ORM 就是把“类与对象”和“表与记录”之间建立一一映射,让你 用写代码操作对象的方式,间接生成并执行 SQL。
ps:如果不使用ORM的话,访问数据库的方式一般是在代码中执行SQL代码吧。
程序员描述数据访问逻辑 > ORM生成SQL语句 > 执行SQL访问数据库。
在这个流程中,有两个地方可以提升性能:
程序员优化代码的数据访问逻辑,该缓存的缓存等;提升数据库服务器的硬件性能。
ORM生成SQL这一步应该是写死的(对于某个特定版本的库,比如DRF1.0.0),没有什么可变化的。
简单来说,问题的原因就是:数据嵌套了,但是默认Load的时候,是懒加载。
如果后续不需要用到内部数据,那懒加载确实更好。
反之,还是一次把需要的内部数据都加载了比较好。
作为例子,DRF的解决方案是,使用select_related/prefetch_related函数。
关于细节还需要继续学习,以下内容主要参考AI回答
为了大规模的应用
在实际生产环境中,「容器化数据库」不是必选的。
相较于其他组件,对于数据库而言,容器化带来的便利不一定会超过代价(复杂程度、安全性等)
数据库导出数据的时候,可能常用csv格式
这里补充一个csv的拓展:tsv格式,也就是 tab 分隔的 CSV。当数据内容中包含逗号的时候,经常用tsv代替csv