Article December 14, 2023

设计关系型数据库的步骤方法

Words count 9.7k Reading time 9 mins. Read count 0

基本概念

搞清楚你要存什么: 比方说,你正在开发一个电子商务网站,你想要存储用户信息、商品和订单。
想好它们之间的关系: 用户可以购买多个商品,而每个商品可以包含在多个订单中。这里就有了用户、商品和订单之间的多对多关系。
为每个存储的内容创建表格: 你需要创建用户表、商品表和订单表。用户表可能包含用户ID、姓名和地址等列。商品表可以包含商品ID、名称和价格等列。订单表可能包含订单ID、日期和总价等列。
为每个记录添加身份标识: 给每个表格的记录添加唯一的ID,例如用户表的用户ID、商品表的商品ID和订单表的订单ID。
选择合适的数据库软件: 选择一个数据库软件,比如MySQL,来创建这些表格,并使用SQL语句定义它们之间的关系。
思考如何存储和检索数据: 设想一下,你需要存储用户的购物历史,以及通过商品查找订单的情况。这将帮助你设计数据库结构和优化查询。
使用外键建立关联: 在用户表中,你可以添加一个外键,比如订单ID,以关联用户和订单。在订单表中,你同样可以添加外键,比如商品ID,以关联订单和商品。
在订单表中添加用户外键: 在订单表中,添加一个”user_id”列,用于存储与该订单相关的用户ID。确保这个”user_id”列是一个外键,引用用户表中的用户ID。
建立用户表与订单表的关系: 用户表中的用户ID与订单表中的”user_id”列形成关联,这样你可以轻松地查找一个用户的所有订单。
实际应用: 当用户下单时,你会在订单表中创建一条新记录,包含订单的详细信息和”user_id”。如果用户购买了多个商品,这些商品的信息将与订单相关联。这种设计使得在需要时,你可以方便地检索某个用户的所有订单,或者查找某个订单中包含的所有商品。

数据库规范化

数据库规范化就是给数据安排个有序的家,让它们住得开心顺利。这有点像整理房间,让每样东西都有自己的地方,不会冗杂乱七八糟。

规范化:就是整理房间的步骤,确保数据的摆放符合规矩。比如,每个房间的物品都要简单,不能太复杂,不然找起来会头疼。

  • 第一范式(1NF):就是保证每样东西都是单一的,不分不散。比如,每个抽屉里只放一个东西,不会有重复或者乱七八糟的组合。
  • 第二范式(2NF):就是在第一范式的基础上,确保每样东西都和主要的家具有直接的关系。别的家具都要直接依赖于主要的那一样,不能有半靠半倚的情况。
  • 第三范式(3NF):就是在第二范式的基础上,消除家具之间的传递依赖。比如,如果A依赖于B,B依赖于C,那么A不能直接依赖于C,要去找B帮忙。
    主键:每个房间都得有个门牌号,独一无二的,方便别人找。这门牌号可以是一个单一的数字,也可以是几个数字的组合。

外键:家具之间也要有联系,比如客厅的沙发和卧室的床,可以通过关联起来。这关联就像是一个家具引用另一个家具的门牌号,确保他们之间的关系稳固。

索引:就像给家具标个号码,方便查找。标在经常用的地方,但别贴太多,不然有点拥挤。

唯一约束:确保每个家具都是独一无二的,不要重复出现。就像每样东西都得有自己的特色。

数据类型:就是确保每样东西都用合适的容器存放,不要用大了或小了的。比如,整数要用整数的盒子,日期要用日期的盒子。

命名规范:给每样东西取个好听又有意义的名字,不然以后找起来会很费劲。

事务管理:就是做事情要一气呵成,要么都成功,要么都失败。比如,收拾房间时,要么全部整理好,要么一样东西都别动。

安全性:得有点门禁,不能让不该进来的人随便闯。保护数据不被乱动。

备份和恢复策略:就像房间定期打扫一样,要有备份,以防万一丢了东西或者家里出了故障。

一些基本的SQL语句

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
-- 创建用户表
CREATE TABLE user (
user_id INT PRIMARY KEY,
name VARCHAR(255),
address VARCHAR(255)
);

-- 创建商品表(假设商品信息包括商品ID、名称和价格)
CREATE TABLE product (
product_id INT PRIMARY KEY,
name VARCHAR(255),
price DECIMAL(10, 2)
);

-- 创建订单表
CREATE TABLE order (
order_id INT PRIMARY KEY,
user_id INT,
order_date DATE,
total_price DECIMAL(10, 2),
FOREIGN KEY (user_id) REFERENCES user(user_id)
);

-- 在订单表中添加用户外键
ALTER TABLE order
ADD COLUMN user_id INT,
ADD CONSTRAINT fk_user
FOREIGN KEY (user_id) REFERENCES user(user_id);

-- 查询一个用户的所有订单
SELECT * FROM `order` WHERE user_id = 1;

-- 查询一个订单的相关用户信息
SELECT * FROM `order`
JOIN user ON `order`.user_id = user.user_id;

-- 插入一条用户记录
INSERT INTO user (user_id, name, address) VALUES (1, 'John Doe', '123 Main Street');

-- 插入一条商品记录
INSERT INTO product (product_id, name, price) VALUES (1, 'Product A', 19.99);

-- 插入一条订单记录
INSERT INTO `order` (order_id, user_id, order_date, total_price) VALUES (1, 1, '2023-01-01', 39.98);

-- 更新订单信息(包括与用户相关的外键)
UPDATE `order` SET total_price = 49.99 WHERE order_id = 1;

-- 删除一条用户记录(外键关联会保证相关订单也被删除)
DELETE FROM user WHERE user_id = 1;

0%