学习数据库最惧怕的是什么呢?惧怕辛苦啃完那本厚厚的书籍之后,才惊觉实际操作根本用不到,惧怕安装好软件后,面对空白的命令行,却全然不知该敲击些什么。而这篇指南不会拐弯抹角,会直接引领你,从零基础通畅地跑完整个流程。
基础概念不是背的而是用的
关系型数据库与非关系型数据库听起来好似选择题,实则更如同工具箱里头具备不同功能的扳手。MySQL、PostgreSQL这类算作关系型数据库,它们擅长在处理结构清晰、且需保持严格一致性的数据方面发挥作用,像电商订单、财务流水这类亦是如此;MongoDB、Redis这类属于非关系型数据库,它们在应对海量并发同时、涵盖频繁变更格式的数据之时会更觉轻松,诸如用户会话信息、实时排行榜这类情况即为示例。
2025年,Stack Overflow开发者调查表明,那种关系型数据库于企业生产里依旧占据63%的份额,然而,非关系型数据库在初创的那些公司以及互联网行业的年增长率可是达到了22%。要知道,选择数据库并非是去挑选冠军,而是要给项目寻觅一双合脚的鞋子。
字段、记录、主键、外键这些称呼,从本质上来说,都是在阐释“怎样将数据规整妥当”。字段是列的标题,记录是一整各行囊括全部信息,主键是这一行数据的身份标识号码,外键乃是连接两张表的通道。
选数据库不是选贵的而是选对的
到2026年时,国内云服务商所提供的托管数据库种类已然超过30种,然而,80%的中小型项目仅是运用MySQL或者PostgreSQL便能够满足需求。要是你的核心业务旨在交易、报表以及有着强一致性要求,那就直接挑选关系型数据库;要是主要用于存储用户评论、日志以及实时位置,MongoDB的文档模型能够节省大量拆表联表所需的,时间。
预算同样属于硬指标,MySQL社区版全然免费,Oracle以及SQL Server的商业授权依据核心数来计价,自2025年起微软针对中小企业推出了每年2999元的SQL Server基础版订阅,初创团队完全能够从免费版着手,业务运作顺畅后再去思量迁移。
设计数据库就像规划仓库货架
三范式是常识但不是教条
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50) NOT NULL,
email VARCHAR(100) UNIQUE NOT NULL,
age INT CHECK (age > 0 AND age < 150),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
第一范式有着这样的要求,那就是每列都不能够再进行分割了,其意思实则表明的是,在一个格子里边不要塞上多个电话号码;第二范式提出一项要求,要求非主键列要完全依赖主键,打个比方说,在订单表里边,把客户姓名单独放置到客户表当中会显得更为合理;第三范式做的是消除传递依赖这件事,也就是说,不要在订单表里边同时存放客户地址以及客户经理电话。
然而,互联网业务因查询速度之故而常常蓄意作出反范式之举,电商订单表中会冗余一份商品快照,即便商品价格发生了改变,用户却依旧能看到下单时刻的价格,如此这般的设计虽牺牲了规范化,可却保住了用户体验。
ALTER TABLE users ADD COLUMN address VARCHAR(255);
表和字段的命名不是小事
在2024年的时候,有一家金融科技公司,由于数据库字段命名处于混乱状态,所以在数据迁移之际,导致多耗费了200人天的人力。像id、name、create_time这样的命名,虽说比较简单,可是在团队协作过程当中,要是加上前缀或者统一风格的话,是能够避免产生误会的。用户表的id称作user_id,订单表中的那个user_id,一眼就能看出来是外键。
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50) NOT NULL,
email VARCHAR(100) UNIQUE NOT NULL,
age INT CHECK (age > 0 AND age < 150),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE orders (
id INT PRIMARY KEY AUTO_INCREMENT,
user_id INT NOT NULL,
product_id INT NOT NULL,
quantity INT NOT NULL,
price DECIMAL(10, 2) NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users(id)
);
CREATE TABLE products (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(100) NOT NULL,
description TEXT,
price DECIMAL(10, 2) NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
选用的字段类型越是紧凑就越是好,年龄采用TINYINT而非INT,状态采用枚举而非字符串,在下含有千万级数据量的情况之下,这样的一些细节能够使得响应时间从800毫秒降低到150毫秒。
SQL不是语法而是对话方式
查询语句的核心是过滤和投影
SELECT name, email, age
FROM users
WHERE age > 18
ORDER BY age DESC
LIMIT 10;
跟在SELECT后面的,是你想要看的那些列,而WHERE后面所列的,则是你用于筛选的条件。在2025年的时候,阿里云数据库团队经过统计发现,性能较差的SQL里面,有百分之七十是由于SELECT直接去拉取全表数据所导致的,所以在线上环境当中,务必要只选取那些需要的字段。
在进行JOIN联表操作之际,小表驱动大表这一情况属于铁定的规律。有一张包含5万条记录的用户表,以及一张拥有500万条记录的订单表,二者进行关联。首先查询用户表,从中过滤出2000人,接着运用这2000人的ID前往订单表展开查询,如此一来速度能够加快十几倍。
增删改操作必须带WHERE
SELECT column1, column2, ...
FROM table_name
WHERE condition;
没有WHERE的UPDATE以及DELETE操作,是生产环境事故的首要祸根。某社交平台在2025年的时候,由于实习生遗漏WHERE条件,从而造成3万条用户动态意外删除,耗费6小时才从冷备中恢复过来。DML操作之前,先运行一遍SELECT来确认影响范围,这样的习惯能够保障安全。
操作实践从搭环境开始
本地安装比云数据库更练手
装MySQL 8.0于Windows系统时,直接去下载MSI安装包,在一路进行Next操作时,要记得选择“Developer Default”;对于Mac用户而言,需通过Homebrew来执行brew install mysql,三分钟便可完成安装,接着运行mysql_secure_installation去初始化权限。安装完成之后,不要着急去敲命令,要先用navicat或者DBeaver进行连接并查看一下,图形界面能够帮助你去理解连接、端口、字符集这些概念。
十分钟跑通增删改查
执行这样的建库之举操作可得,CREATE DATABASE shop charset utf8mb4;而创建表格的语句是这般模样,CREATE TABLE user (id INT PRIMARY KEY, name VARCHAR(20))。对于插入数据,是INSERT INTO user VALUES (1, ‘张三’) ;对于查询数据,是SELECT FROM user WHERE id = 1 ;处理更新数据,是UPDATE user SET name = ‘李四’ WHERE id = 1 ;而论及删除数据呢,是DELETE FROM user WHERE id = 1。
这五步走完,数据库最核心的骨架你已经摸到了。
安全维护是保命基本功
权限最小化能防内鬼
CREATE DATABASE my_database;
USE my_database;
某电商公司于2026年初泄露了50万条用户地址,经调查发现,乃是离职员工的账号未及时销户所致。开发账号仅给予增删改查权限,DBA账号保留表结构修改权限,业务账号仅能操作指定库。备份权限更是要与日常操作权限进行彻底分离。
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50) NOT NULL,
email VARCHAR(100) UNIQUE NOT NULL,
age INT CHECK (age > 0 AND age < 150),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
备份策略定生死
那种规模处于中小型范畴的工程项目,每日都要开展全量备份操作,并且每隔两个小时就得进行一次增量备份,将最近七天的数据予以保留;针对处于核心地位的金融业务,采用两地三中心的模式,与此同时要维持至少三个不同时间点的快照;每一周都要挑选出一台测试机器去执行恢复演练工作,以此来确保备份文件确实能够实现还原。
INSERT INTO users (name, email, age)
VALUES ('John Doe', 'john.doe@example.com', 25);
学习数据库之际,你所遭遇的最为严重的失误是什么?是在操作时单单遗漏添加WHERE条件从而错误地删去了表,还是于进行表设计期间未曾预留得以足够支持的数据字段长度?在评论区域交流交流你的相关经历,点赞以及收藏此文章,等下次碰到问题之时还能够将其翻找出来用于查看。
SELECT * FROM users;

Comments NOTHING