学习目标:

  • 学习

实验

        图书管理系统是数据库设计的经典场景,通过它可以清晰理解 “需求分析→表结构设计→建库建表” 的完整流程。本文将基于用户需求,一步步完成图书管理系统的数据库设计与实现,带你掌握从 0 到 1 构建业务数据库的核心逻辑。

一、需求分析与数据库设计原则

1. 需求拆解

用户需要设计三张表:

  • 用户表:管理系统使用者,包含姓名、用户名、密码、电话、住址、专业及年级。
  • 图书表:管理图书信息,包含图书名、分类、介绍、出版社、入库时间。
  • 借阅登记表:管理图书借阅记录,包含借阅人、图书名、借阅时间、是否归还。

2. 数据库设计三大原则

  • 原子性:字段不可再分(如 “专业及年级” 可拆为 “专业” 和 “年级”,避免冗余)。
  • 关联性:通过主键、外键建立表间关联(如借阅表需关联用户和图书)。
  • 完整性:通过约束保证数据有效(如非空、唯一、默认值)。

二、图书管理系统数据库表结构详解(含字段类型与约束) 

        在图书管理系统的数据库设计中,表结构的合理性直接决定了系统的稳定性和扩展性。以下是基于提供的 SQL 脚本,整理的三张核心表的详细结构说明,包含字段类型、约束规则及设计逻辑。

一、数据库基本信息

数据库名称 字符集 用途
library_management_system utf8mb4 存储图书、用户及借阅数据

二、用户表(users)—— 系统用户信息管理

字段名 数据类型 约束条件 长度限制 备注说明
user_id INT 主键、自增 - 用户唯一标识,作为其他表关联的外键(如借阅记录)
name VARCHAR 非空(NOT NULL 50 用户真实姓名,必填项(如 “张三”)
username VARCHAR 唯一(UNIQUE)、非空 50 登录用户名,不可重复(如 “zhangsan123”),保证账号唯一性
password VARCHAR 非空 100 登录密码,预留加密空间(如 SHA256 加密后长度约 64 位,建议生产环境加密存储)
phone VARCHAR 可空 20 联系电话,支持固定电话和手机号(如 “13800138000”“010-12345678”)
address VARCHAR 可空 200 家庭住址,存储详细地址信息(如 “北京市海淀区 XX 街道 XX 号”)
major VARCHAR 可空 50 所属专业(如 “计算机科学与技术”“汉语言文学”),适用于学生用户
grade VARCHAR 可空 20 年级信息(如 “2021 级”“大三”),配合专业字段细化用户分类
created_at TIMESTAMP 默认当前时间 - 记录用户创建时间,用于统计用户注册趋势(自动生成,无需手动插入)

设计逻辑

  • 以 user_id 为主键,确保每个用户有唯一标识;
  • username 设为唯一约束,避免重复注册;
  • 预留 major 和 grade 字段,适配校园图书馆的学生用户场景;
  • created_at 自动记录创建时间,便于系统运营分析。

三、图书表(books)—— 图书资源信息管理

字段名 数据类型 约束条件 长度限制 备注说明
book_id INT 主键、自增 - 图书唯一标识,作为借阅记录的关联外键
title VARCHAR 非空 100 图书名称(如《MySQL 必知必会》),支持大多数图书名长度
category VARCHAR 非空 50 图书分类(如 “计算机科学”“文学小说”“历史”),便于图书检索和管理
description TEXT 可空 - 图书简介(无长度限制),存储详细内容(如作者简介、内容摘要)
publisher VARCHAR 可空 100 出版社名称(如 “机械工业出版社”“人民文学出版社”)
entry_date DATE 非空 - 入库日期(如 “2023-01-15”),用于统计新书入库量和图书库存周期
created_at TIMESTAMP 默认当前时间 - 记录图书信息创建时间,用于追踪数据录入历史

设计逻辑

  • title 和 category 设为非空,确保图书的核心信息完整;
  • description 采用 TEXT 类型,支持大段文本描述,不限制长度;
  • entry_date 精确到日期,便于图书馆管理员统计 “月度 / 年度入库图书”;
  • 预留 publisher 字段,满足图书信息的完整性需求。

四、借阅登记表(borrow_records)—— 借阅业务流程管理

字段名 数据类型 约束条件 长度限制 备注说明
record_id INT 主键、自增 - 借阅记录唯一标识,用于查询和管理单条借阅记录
user_id INT 非空、外键(关联 users.user_id - 关联借阅人,确保借阅记录归属有效用户
book_id INT 非空、外键(关联 books.book_id - 关联借阅图书,确保借阅的图书在系统中存在
borrow_date DATETIME 非空 - 借阅时间(精确到时分秒,如 “2023-10-01 14:30:00”)
is_returned BOOLEAN 默认 FALSE - 归还状态:FALSE(未还)、TRUE(已还),默认值为未还
return_date DATETIME 可空 - 归还时间(精确到时分秒),仅当 is_returned=TRUE 时有值
created_at TIMESTAMP 默认当前时间 - 记录借阅记录创建时间,用于追踪业务发生时间
外键规则 - ON DELETE CASCADE(级联删除) - 若关联的用户或图书被删除,对应的借阅记录自动删除,避免数据冗余

实验配置内容(每一个设备的每一步操作)


CREATE DATABASE IF NOT EXISTS library_management_system;


USE library_management_system;


CREATE TABLE IF NOT EXISTS users (
    user_id INT PRIMARY KEY AUTO_INCREMENT COMMENT '用户ID',
    name VARCHAR(50) NOT NULL COMMENT '姓名',
    username VARCHAR(50) UNIQUE NOT NULL COMMENT '用户名',
    password VARCHAR(100) NOT NULL COMMENT '密码',
    phone VARCHAR(20) COMMENT '电话',
    address VARCHAR(200) COMMENT '住址',
    major VARCHAR(50) COMMENT '专业',
    grade VARCHAR(20) COMMENT '年级',
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表';


CREATE TABLE IF NOT EXISTS books (
    book_id INT PRIMARY KEY AUTO_INCREMENT COMMENT '图书ID',
    title VARCHAR(100) NOT NULL COMMENT '图书名',
    category VARCHAR(50) NOT NULL COMMENT '分类',
    description TEXT COMMENT '介绍',
    publisher VARCHAR(100) COMMENT '出版社',
    entry_date DATE NOT NULL COMMENT '入库时间',
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='图书表';


CREATE TABLE IF NOT EXISTS borrow_records (
    record_id INT PRIMARY KEY AUTO_INCREMENT COMMENT '借阅记录ID',
    user_id INT NOT NULL COMMENT '借阅人ID',
    book_id INT NOT NULL COMMENT '图书ID',
    borrow_date DATETIME NOT NULL COMMENT '借阅时间',
    is_returned BOOLEAN DEFAULT FALSE COMMENT '是否归还',
    return_date DATETIME COMMENT '归还时间',
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    -- 外键约束
    FOREIGN KEY (user_id) REFERENCES users(user_id) ON DELETE CASCADE,
    FOREIGN KEY (book_id) REFERENCES books(book_id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='借阅登记表';

DESC users;
DESC books;
DESC borrow_records;

USE library_management_system;


INSERT INTO users (name, username, password, phone, address, major, grade)
VALUES ('张三', 'zhangsan', 'password123', '13800138000', '广东', '计算机科学', '大三');

INSERT INTO books (title, category, description, publisher, entry_date)
VALUES ('数据库原理与应用', '计算机科学', '本书介绍数据库的基本原理和实际应用', '高等教育出版社', '2023-01-15');


INSERT INTO borrow_records (user_id, book_id, borrow_date, is_returned)
VALUES (1, 1, '2023-06-10 14:30:00', FALSE);


SELECT * FROM users;


SELECT * FROM books;


SELECT * FROM borrow_records;

实验结果验证


学习时间:

学习时间为学习时间

学习时间 筋肉人
为学习时间 future

内容为笔记【有时比较抽象,有时比较过于详细,请宽恕。作者可能写的是仅个人笔记,筋肉人future】  


学习产出:

  • 技术笔记 1遍
  • 有错误请指出,作者会及时改正

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐