在 Nuxt 项目里,精心设计数据库以及熟练掌握数据的增删改查操作,是构建稳定且功能完备的应用的关键。下面就来深入剖析各个环节。
数据库设计原则
- 业务驱动原则:数据库是为业务服务的,所以一切设计都要紧扣项目业务需求。在着手设计表结构前,要和项目团队充分沟通,梳理出所有涉及数据处理的业务场景。例如开发一款资讯聚合类的 Nuxt 应用,就得清楚知晓文章的分类、来源、发布时间,以及用户的收藏、评论等行为相关的数据需求,让数据库设计有的放矢。
- 规范化与冗余平衡:规范化能消除数据冗余,提升数据一致性与完整性,遵循范式规则是常见做法。但过度追求规范化,会让查询变得复杂,性能受损。以电商项目里的商品表和商品详情表为例,商品基本信息(名称、价格)放一个表,详细描述放另一个表,虽符合范式,可频繁查询时需多表联查,影响效率。所以,在关键查询场景多、性能要求高的地方,适当保留一定冗余,换取查询速度提升。
- 扩展性考量:项目不是一成不变的,业务拓展、新功能上线都可能带来新的数据需求。设计数据库时,预留一些灵活字段或者采用分区表等策略很有必要。比如社交应用初期用户表结构简单,但后续要添加实名认证相关字段,提前预留字段空间就能避免大规模重构数据表。
理论的内容我们这里就不再更多介绍了,前文我们通过插件给自己创建了一个名为qrcodetest的数据库。
那么如何设计数据库首先需要了解数据库的基本数据类型
数据类型
| 数据类型分类 | 类型 | 大小 | 范围(有符号) | 范围(无符号) | 格式 | 用途示例 |
|---|---|---|---|---|---|---|
| 字符串类型 | CHAR | 0 - 255 bytes | - | - | - | 存储固定长度字符串,如身份证号,CHAR(18)可精准存储 18 位身份证号码 |
| VARCHAR | 0 - 65535 bytes | - | - | - | 用于变长字符串,像用户名,长度不一,节省空间 | |
| TINYBLOB | 0 - 255 bytes | - | - | - | 存放不超 255 字符的二进制数据,小型二进制文件片段 | |
| TINYTEXT | 0 - 255 bytes | - | - | - | 简短文本描述,比如商品短评 | |
| BLOB | 0 - 65535 bytes | - | - | - | 较长二进制数据,不过大文件一般不直接存,多存路径 | |
| TEXT | 0 - 65535 bytes | - | - | - | 长文本,如博客文章内容 | |
| MEDIUMBLOB | 0 - 16777215 bytes | - | - | - | 中等长度二进制数据 | |
| MEDIUMTEXT | 0 - 16777215 bytes | - | - | - | 中篇幅文章、产品详情介绍 | |
| LONGBLOB | 0 - 4294967295 bytes | - | - | - | 超大二进制数据 | |
| LONGTEXT | 0 - 4294967295 bytes | - | - | - | 巨量文本内容,学术论文等 | |
| 数值类型 | TINYINT | 1 Byte | (-128, 127) | (0, 255) | - | 表示小整数值,用 0 和 1 代表性别 |
| SMALLINT | 2 Bytes | (-32768, 32767) | (0, 65535) | - | 稍大整数场景,如小型计数器 | |
| MEDIUMINT | 3 Bytes | (-8388608, 8388607) | (0, 16777215) | - | 计数器、有限范围统计数据 | |
| INT/INTEGER | 4 Bytes | (-2147483648, 2147483647) | (0, 4294967295) | - | 用户 ID、订单数量常用此类型存储 | |
| BIGINT | 8 Bytes | (-9223372036854775808, 9223372036854775807) | (0, 18446744073709551615) | - | 大型系统海量数据统计值 | |
| FLOAT | 4 Bytes | (-3.402823466E + 38, -1.175494351E - 38), 0, (1.175494351E - 38, 3.402823466351E + 38) | 0, (1.175494351E - 38, 3.402823466E + 38) | - | 对精度要求稍低的科学运算场景 | |
| DOUBLE | 8 Bytes | (-1.7976931348623157E + 308, -2.2250738585072014E - 308), 0, (2.2250738585072014E - 308, 1.7976931348623157E + 308) | 0, (2.2250738585072014E - 308, 1.7976931348623157E + 308) | - | 高精度科学计算、工程计算场景 | |
| DECIMAL | 根据DECIMAL(M,D),若M>D,为M + 2;否则为D + 2 | 依赖于M和D值 | 依赖于M和D值 | - | 财务数据,如商品精确价格,DECIMAL(10,2)表示最多 10 位含 2 位小数 | |
| 日期和时间类型 | DATE | 3 bytes | 1000 - 01 - 01/9999 - 12 - 31 | - | YYYY - MM - DD | 记录生日、订单创建日期 |
| TIME | 3 bytes | '-838:59:59'/'838:59:59' | - | HH:MM:SS | 会议时长、视频播放时长计时 | |
| YEAR | 1 byte | 1901/2155 | - | YYYY | 产品生产年份标识 | |
| DATETIME | 8 bytes | '1000 - 01 - 01 00:00:00' 到 '9999 - 12 - 31 23:59:59' | - | YYYY - MM - DD hh:mm:ss | 事件发生的完整时间记录 | |
| TIMESTAMP | 4 bytes | '1970 - 01 - 01 00:00:01' UTC 到 '2038 - 01 - 19 03:14:07' UTC(北京时间 2038 - 1 - 19 11:14:07) | - | YYYY - MM - DD hh:mm:ss | 常用于记录数据最后修改时间 | |
数据表的设计
在了解了 MySQL 的各类基础数据类型后,接下来就该学习如何运用这些数据类型来创建数据表了。数据表是数据库存储数据的核心载体,合理规划表结构至关重要。
我们下载的可视化插件就可以派上用场了,我们点击tables的加号会帮我们自动填入一个基础的sql表创建语句
CREATE TABLE table_name(
id int NOT NULL PRIMARY KEY AUTO_INCREMENT COMMENT 'Primary Key',
create_time DATETIME COMMENT 'Create Time',
name VARCHAR(255)
) COMMENT '';
数据库建表的语法格式如下
CREATE TABLE [数据库名].[表名] (
列名1 数据类型 [约束条件],
列名2 数据类型 [约束条件],
...
[表级约束条件]
);
那么根据这个内容我们可以回头解读上面这段sql语句的含义
-
CREATE TABLE table_name(:这是创建表的起始语句,table_name是即将创建的表的名称,后续括号内定义该表的各个列及其属性。 -
id int NOT NULL PRIMARY KEY AUTO_INCREMENT COMMENT 'Primary Key',:id int:定义了一个名为id的列,数据类型是整数(int)。NOT NULL:添加了非空约束,意味着往这张表插入数据时,id列必须有值,不能为NULL。PRIMARY KEY:将id列指定为主键。主键用于唯一标识表中的每一行记录,一张表通常仅有一个主键,有了主键能更高效地查询、关联和维护数据。AUTO_INCREMENT:设置id列为自增列。每当向表中插入一条新记录时,如果没有为id列显式指定值,数据库会自动为该列分配一个比当前最大id值大 1 的整数,常用于自动生成唯一的标识符。COMMENT 'Primary Key':这是列注释,用于给开发人员或数据库管理员提供额外信息,这里明确说明了id列是主键。
-
create_time DATETIME COMMENT 'Create Time',:create_time DATETIME:定义名为create_time的列,数据类型是DATETIME,用于存储日期和时间值,格式为YYYY-MM-DD hh:mm:ss。COMMENT 'Create Time':给create_time列添加注释,提示该列用于记录创建时间。
-
name VARCHAR(255):定义名为name的列,数据类型是VARCHAR,最大长度为 255,用于存储可变长度的字符串。这种类型适合存储像用户名、产品名这类长度不定的文本信息。 -
) COMMENT '';:括号闭合,标志着表结构定义完成,最后的COMMENT ''是给整个表添加注释,这里注释内容为空。总的来说,这条语句创建了一个名为table_name的表,表中有id、create_time和name三个列,各自带有相应的数据类型、约束和注释信息。
如果我想在里面加更多我想要的字段,那么在建表之前我只需要增加
CREATE TABLE table_name(
id int NOT NULL PRIMARY KEY AUTO_INCREMENT COMMENT 'Primary Key',
create_time DATETIME COMMENT 'Create Time',
android VARCHAR(255),
ios VARCHAR(255),
name VARCHAR(255)
) COMMENT '';
执行我们新完善的sql脚本一张数据表就完成创建了
我们可以在出现的可视化窗口完成数据的插入和字段的增减
也可以通过这里对表的字段做编辑
了解完如何使用可视化插件操作数据库,那么我们就不再对sql命令多更多的介绍了,sql命令是十分重要的内容,在这里的这点篇幅不好.3 0
比如我这次的需求是这样一个商品信息表,那么我需要设计的字段就会是
起码需要的就有
-
game_name- 数据类型:
VARCHAR(255) - 描述:游戏名称
- 数据类型:
-
description- 数据类型:
TEXT - 描述:游戏描述
- 数据类型:
-
price- 数据类型:
DECIMAL(10, 2) - 描述:游戏价格
- 数据类型:
-
image_path- 数据类型:
VARCHAR(255) - 描述:游戏图片路径(假设采用存储图片路径的方式)
- 数据类型:
CREATE TABLE game_information (
id INT PRIMARY KEY AUTO_INCREMENT,
game_name VARCHAR(255),
description TEXT,
price DECIMAL(10, 2),
image_path VARCHAR(255)
);
对数据库数据的增删改查
上文我们稍微提到了一下可视化的插件中如何添加数据,个人觉得可视化部分的增删改查操作不需要单独介绍,只需要看着图标用就可以了。
我们知道后端需要和数据库交互涉及到数据的更新必然需要操作数据库,那么开发者需要如何对数据库做更新,肯定不会是通过可视化界面手动操作的。
接下来,就简单聊聊开发者该如何运用代码,精准、高效地对数据库执行更新操作。
(一)插入数据(INSERT)
-
基本语法
-
插入单条数据:
- 语法:
INSERT INTO table_name (column1, column2, column3,...) VALUES (value1, value2, value3,...); - 例如,在之前创建的
game_information表中插入一条游戏数据:
INSERT INTO game_information (game_name, description, price, image_path) VALUES ('塞尔达传说:旷野之息', '这是一款开放世界冒险游戏', 39.99, '/path/to/zelda_image.jpg'); - 语法:
-
插入多条数据:
- 语法:
INSERT INTO table_name (column1, column2, column3,...) VALUES (value1, value2, value3,...), (value4, value5, value6,...),...; - 例如,再插入两条游戏数据:
INSERT INTO game_information (game_name, description, price, image_path) VALUES ('超级马里奥:奥德赛', '这是一款平台跳跃冒险游戏', 49.99, '/path/to/mario_image.jpg'), ('动物森友会', '这是一款模拟经营游戏', 59.99, '/path/to/animal_crossing_image.jpg'); - 语法:
-
-
注意事项
- 插入数据时,
VALUES中的值要与(column1, column2, column3,...)中的列一一对应,且数据类型要匹配。 - 如果要插入所有列的数据,可以省略列名部分,直接写成
INSERT INTO table_name VALUES (value1, value2, value3,...);,但这种方式要求值的顺序必须与表中列的顺序一致。
- 插入数据时,
(二)删除数据(DELETE)
-
基本语法
- 格式:
DELETE FROM table_name [WHERE condition]; - 例如,删除
game_information表中价格大于 50 的游戏数据:
DELETE FROM game_information WHERE price > 50;- 如果没有
WHERE子句,则会删除表中的所有数据。例如:
DELETE FROM game_information; - 格式:
-
注意事项
- 使用
DELETE语句时要特别小心,尤其是没有WHERE条件时,会导致所有数据丢失。 - 可以使用
TRUNCATE TABLE语句来快速删除表中的所有数据并重置自增列。TRUNCATE TABLE比不带WHERE条件的DELETE执行速度更快,但它不能与WHERE一起使用,例如:TRUNCATE TABLE game_information;
- 使用
(三)修改数据(UPDATE)
-
基本语法
- 格式:
UPDATE table_name SET column1 = value1, column2 = value2,... [WHERE condition]; - 例如,将
game_information表中游戏名为 ' 塞尔达传说:旷野之息 ' 的价格修改为 49.99:
UPDATE game_information SET price = 49.99 WHERE game_name = '塞尔达传说:旷野之息'; - 格式:
-
注意事项
- 同样,
WHERE子句很重要,如果没有WHERE条件,会更新表中所有记录的指定列。 - 可以一次更新多个列的值,如
UPDATE game_information SET price = 44.99, description = '这是一款非常受欢迎的开放世界冒险游戏' WHERE game_name = '塞尔达传说:旷野之息';
- 同样,
(四)查询数据(SELECT)
-
基本语法
- 格式:
SELECT column1, column2,... FROM table_name [WHERE condition] [ORDER BY column [ASC|DESC]] [LIMIT number]; - 查询
game_information表中的所有游戏名称和价格:
SELECT game_name, price FROM game_information;- 查询价格小于 50 的游戏,并按照价格升序排列:
SELECT * FROM game_information WHERE price < 50 ORDER BY price ASC;- 查询价格最高的两条游戏数据:
SELECT * FROM game_information ORDER BY price DESC LIMIT 2; - 格式:
-
注意事项
*表示选择所有列。WHERE子句用于筛选数据。ORDER BY用于对结果进行排序,ASC为升序(默认),DESC为降序。LIMIT用于限制返回的行数。
总结
在 Nuxt 项目的开发旅程中,数据库操作可是重头戏。咱们唠了这么多增删改查的门道,其实就是为了给项目搭好稳固 “后台”。学会用代码操控数据库,就相当于握住了项目的 “命门”。
对于咱们大多专注于前端开发的小伙伴而言,数据库操作乍一听,好像隔着层纱,有点陌生又神秘。但别小瞧了它,这可是打造一个功能完备、体验丝滑的 Nuxt 项目不可或缺的 “幕后功臣”。
后端的前置内容说的差不多了,那么下一节我将和大家介绍接口设计以及接口开发,以帮助大家能够独立的开发一个完整的项目。