软件工程:数据库设计

📌目录



⚖️ 数据库设计:构建高效数据存储的基石

数据库设计是软件设计的重要组成部分,它决定了系统的数据存储结构和数据管理方式,直接影响系统的性能和可维护性。本文将详细介绍数据库设计的概念、步骤、方法和实施要点。

🎯 一、数据库设计概述

(一)数据库设计的定义

数据库设计是确定数据库的结构、约束和关系的过程,是软件设计的重要组成部分。

数据库设计概念:
#mermaid-svg-EwbXNCBFu3xonjQj{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-EwbXNCBFu3xonjQj .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-EwbXNCBFu3xonjQj .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-EwbXNCBFu3xonjQj .error-icon{fill:#552222;}#mermaid-svg-EwbXNCBFu3xonjQj .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-EwbXNCBFu3xonjQj .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-EwbXNCBFu3xonjQj .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-EwbXNCBFu3xonjQj .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-EwbXNCBFu3xonjQj .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-EwbXNCBFu3xonjQj .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-EwbXNCBFu3xonjQj .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-EwbXNCBFu3xonjQj .marker{fill:#333333;stroke:#333333;}#mermaid-svg-EwbXNCBFu3xonjQj .marker.cross{stroke:#333333;}#mermaid-svg-EwbXNCBFu3xonjQj svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-EwbXNCBFu3xonjQj p{margin:0;}#mermaid-svg-EwbXNCBFu3xonjQj .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-EwbXNCBFu3xonjQj .cluster-label text{fill:#333;}#mermaid-svg-EwbXNCBFu3xonjQj .cluster-label span{color:#333;}#mermaid-svg-EwbXNCBFu3xonjQj .cluster-label span p{background-color:transparent;}#mermaid-svg-EwbXNCBFu3xonjQj .label text,#mermaid-svg-EwbXNCBFu3xonjQj span{fill:#333;color:#333;}#mermaid-svg-EwbXNCBFu3xonjQj .node rect,#mermaid-svg-EwbXNCBFu3xonjQj .node circle,#mermaid-svg-EwbXNCBFu3xonjQj .node ellipse,#mermaid-svg-EwbXNCBFu3xonjQj .node polygon,#mermaid-svg-EwbXNCBFu3xonjQj .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-EwbXNCBFu3xonjQj .rough-node .label text,#mermaid-svg-EwbXNCBFu3xonjQj .node .label text,#mermaid-svg-EwbXNCBFu3xonjQj .image-shape .label,#mermaid-svg-EwbXNCBFu3xonjQj .icon-shape .label{text-anchor:middle;}#mermaid-svg-EwbXNCBFu3xonjQj .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-EwbXNCBFu3xonjQj .rough-node .label,#mermaid-svg-EwbXNCBFu3xonjQj .node .label,#mermaid-svg-EwbXNCBFu3xonjQj .image-shape .label,#mermaid-svg-EwbXNCBFu3xonjQj .icon-shape .label{text-align:center;}#mermaid-svg-EwbXNCBFu3xonjQj .node.clickable{cursor:pointer;}#mermaid-svg-EwbXNCBFu3xonjQj .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-EwbXNCBFu3xonjQj .arrowheadPath{fill:#333333;}#mermaid-svg-EwbXNCBFu3xonjQj .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-EwbXNCBFu3xonjQj .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-EwbXNCBFu3xonjQj .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-EwbXNCBFu3xonjQj .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-EwbXNCBFu3xonjQj .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-EwbXNCBFu3xonjQj .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-EwbXNCBFu3xonjQj .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-EwbXNCBFu3xonjQj .cluster text{fill:#333;}#mermaid-svg-EwbXNCBFu3xonjQj .cluster span{color:#333;}#mermaid-svg-EwbXNCBFu3xonjQj div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-EwbXNCBFu3xonjQj .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-EwbXNCBFu3xonjQj rect.text{fill:none;stroke-width:0;}#mermaid-svg-EwbXNCBFu3xonjQj .icon-shape,#mermaid-svg-EwbXNCBFu3xonjQj .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-EwbXNCBFu3xonjQj .icon-shape p,#mermaid-svg-EwbXNCBFu3xonjQj .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-EwbXNCBFu3xonjQj .icon-shape .label rect,#mermaid-svg-EwbXNCBFu3xonjQj .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-EwbXNCBFu3xonjQj .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-EwbXNCBFu3xonjQj .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-EwbXNCBFu3xonjQj :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 数据库设计
需求分析
概念设计
逻辑设计
物理设计
实施维护
数据需求
E-R图
关系模式
物理模式
数据库实施

(二)数据库设计的地位

在软件设计中的地位:
#mermaid-svg-k1k7A4Hf5UD55CLU{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-k1k7A4Hf5UD55CLU .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-k1k7A4Hf5UD55CLU .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-k1k7A4Hf5UD55CLU .error-icon{fill:#552222;}#mermaid-svg-k1k7A4Hf5UD55CLU .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-k1k7A4Hf5UD55CLU .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-k1k7A4Hf5UD55CLU .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-k1k7A4Hf5UD55CLU .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-k1k7A4Hf5UD55CLU .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-k1k7A4Hf5UD55CLU .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-k1k7A4Hf5UD55CLU .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-k1k7A4Hf5UD55CLU .marker{fill:#333333;stroke:#333333;}#mermaid-svg-k1k7A4Hf5UD55CLU .marker.cross{stroke:#333333;}#mermaid-svg-k1k7A4Hf5UD55CLU svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-k1k7A4Hf5UD55CLU p{margin:0;}#mermaid-svg-k1k7A4Hf5UD55CLU .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-k1k7A4Hf5UD55CLU .cluster-label text{fill:#333;}#mermaid-svg-k1k7A4Hf5UD55CLU .cluster-label span{color:#333;}#mermaid-svg-k1k7A4Hf5UD55CLU .cluster-label span p{background-color:transparent;}#mermaid-svg-k1k7A4Hf5UD55CLU .label text,#mermaid-svg-k1k7A4Hf5UD55CLU span{fill:#333;color:#333;}#mermaid-svg-k1k7A4Hf5UD55CLU .node rect,#mermaid-svg-k1k7A4Hf5UD55CLU .node circle,#mermaid-svg-k1k7A4Hf5UD55CLU .node ellipse,#mermaid-svg-k1k7A4Hf5UD55CLU .node polygon,#mermaid-svg-k1k7A4Hf5UD55CLU .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-k1k7A4Hf5UD55CLU .rough-node .label text,#mermaid-svg-k1k7A4Hf5UD55CLU .node .label text,#mermaid-svg-k1k7A4Hf5UD55CLU .image-shape .label,#mermaid-svg-k1k7A4Hf5UD55CLU .icon-shape .label{text-anchor:middle;}#mermaid-svg-k1k7A4Hf5UD55CLU .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-k1k7A4Hf5UD55CLU .rough-node .label,#mermaid-svg-k1k7A4Hf5UD55CLU .node .label,#mermaid-svg-k1k7A4Hf5UD55CLU .image-shape .label,#mermaid-svg-k1k7A4Hf5UD55CLU .icon-shape .label{text-align:center;}#mermaid-svg-k1k7A4Hf5UD55CLU .node.clickable{cursor:pointer;}#mermaid-svg-k1k7A4Hf5UD55CLU .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-k1k7A4Hf5UD55CLU .arrowheadPath{fill:#333333;}#mermaid-svg-k1k7A4Hf5UD55CLU .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-k1k7A4Hf5UD55CLU .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-k1k7A4Hf5UD55CLU .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-k1k7A4Hf5UD55CLU .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-k1k7A4Hf5UD55CLU .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-k1k7A4Hf5UD55CLU .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-k1k7A4Hf5UD55CLU .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-k1k7A4Hf5UD55CLU .cluster text{fill:#333;}#mermaid-svg-k1k7A4Hf5UD55CLU .cluster span{color:#333;}#mermaid-svg-k1k7A4Hf5UD55CLU div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-k1k7A4Hf5UD55CLU .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-k1k7A4Hf5UD55CLU rect.text{fill:none;stroke-width:0;}#mermaid-svg-k1k7A4Hf5UD55CLU .icon-shape,#mermaid-svg-k1k7A4Hf5UD55CLU .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-k1k7A4Hf5UD55CLU .icon-shape p,#mermaid-svg-k1k7A4Hf5UD55CLU .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-k1k7A4Hf5UD55CLU .icon-shape .label rect,#mermaid-svg-k1k7A4Hf5UD55CLU .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-k1k7A4Hf5UD55CLU .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-k1k7A4Hf5UD55CLU .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-k1k7A4Hf5UD55CLU :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 需求分析
概要设计
详细设计
数据库设计
编码实现
设计核心

(三)数据库设计的意义

设计意义:

意义 说明
数据组织 合理组织数据
数据完整 保证数据完整
数据一致 保证数据一致
性能优化 优化系统性能
易于维护 便于系统维护

📦 二、数据库设计的步骤

(一)设计步骤

数据库设计步骤:
#mermaid-svg-Wj1FSGxLndwM9t4t{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-Wj1FSGxLndwM9t4t .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-Wj1FSGxLndwM9t4t .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-Wj1FSGxLndwM9t4t .error-icon{fill:#552222;}#mermaid-svg-Wj1FSGxLndwM9t4t .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-Wj1FSGxLndwM9t4t .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-Wj1FSGxLndwM9t4t .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-Wj1FSGxLndwM9t4t .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-Wj1FSGxLndwM9t4t .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-Wj1FSGxLndwM9t4t .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-Wj1FSGxLndwM9t4t .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-Wj1FSGxLndwM9t4t .marker{fill:#333333;stroke:#333333;}#mermaid-svg-Wj1FSGxLndwM9t4t .marker.cross{stroke:#333333;}#mermaid-svg-Wj1FSGxLndwM9t4t svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-Wj1FSGxLndwM9t4t p{margin:0;}#mermaid-svg-Wj1FSGxLndwM9t4t .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-Wj1FSGxLndwM9t4t .cluster-label text{fill:#333;}#mermaid-svg-Wj1FSGxLndwM9t4t .cluster-label span{color:#333;}#mermaid-svg-Wj1FSGxLndwM9t4t .cluster-label span p{background-color:transparent;}#mermaid-svg-Wj1FSGxLndwM9t4t .label text,#mermaid-svg-Wj1FSGxLndwM9t4t span{fill:#333;color:#333;}#mermaid-svg-Wj1FSGxLndwM9t4t .node rect,#mermaid-svg-Wj1FSGxLndwM9t4t .node circle,#mermaid-svg-Wj1FSGxLndwM9t4t .node ellipse,#mermaid-svg-Wj1FSGxLndwM9t4t .node polygon,#mermaid-svg-Wj1FSGxLndwM9t4t .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-Wj1FSGxLndwM9t4t .rough-node .label text,#mermaid-svg-Wj1FSGxLndwM9t4t .node .label text,#mermaid-svg-Wj1FSGxLndwM9t4t .image-shape .label,#mermaid-svg-Wj1FSGxLndwM9t4t .icon-shape .label{text-anchor:middle;}#mermaid-svg-Wj1FSGxLndwM9t4t .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-Wj1FSGxLndwM9t4t .rough-node .label,#mermaid-svg-Wj1FSGxLndwM9t4t .node .label,#mermaid-svg-Wj1FSGxLndwM9t4t .image-shape .label,#mermaid-svg-Wj1FSGxLndwM9t4t .icon-shape .label{text-align:center;}#mermaid-svg-Wj1FSGxLndwM9t4t .node.clickable{cursor:pointer;}#mermaid-svg-Wj1FSGxLndwM9t4t .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-Wj1FSGxLndwM9t4t .arrowheadPath{fill:#333333;}#mermaid-svg-Wj1FSGxLndwM9t4t .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-Wj1FSGxLndwM9t4t .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-Wj1FSGxLndwM9t4t .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-Wj1FSGxLndwM9t4t .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-Wj1FSGxLndwM9t4t .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-Wj1FSGxLndwM9t4t .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-Wj1FSGxLndwM9t4t .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-Wj1FSGxLndwM9t4t .cluster text{fill:#333;}#mermaid-svg-Wj1FSGxLndwM9t4t .cluster span{color:#333;}#mermaid-svg-Wj1FSGxLndwM9t4t div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-Wj1FSGxLndwM9t4t .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-Wj1FSGxLndwM9t4t rect.text{fill:none;stroke-width:0;}#mermaid-svg-Wj1FSGxLndwM9t4t .icon-shape,#mermaid-svg-Wj1FSGxLndwM9t4t .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-Wj1FSGxLndwM9t4t .icon-shape p,#mermaid-svg-Wj1FSGxLndwM9t4t .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-Wj1FSGxLndwM9t4t .icon-shape .label rect,#mermaid-svg-Wj1FSGxLndwM9t4t .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-Wj1FSGxLndwM9t4t .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-Wj1FSGxLndwM9t4t .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-Wj1FSGxLndwM9t4t :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 数据库设计步骤
需求分析
概念设计
逻辑设计
物理设计
数据库实施
运行维护
分析数据需求
设计E-R图
设计关系模式
设计物理模式
创建数据库
维护优化

步骤详解:

步骤 任务 产出
需求分析 分析数据需求 数据需求规格
概念设计 设计概念模型 E-R图
逻辑设计 设计逻辑模型 关系模式
物理设计 设计物理模型 物理模式
数据库实施 创建数据库 数据库
运行维护 维护优化 优化方案

(二)需求分析

需求分析:

分析系统的数据需求。

分析内容:

内容 说明
数据需求 需要什么数据
处理需求 如何处理数据
完整性需求 数据完整性要求
安全性需求 数据安全性要求

🌐 三、概念设计

(一)概念设计的定义

概念设计是设计数据库的概念模型,通常使用E-R图表示。

概念设计概念:
#mermaid-svg-DEq0GGyYbleQU5X3{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-DEq0GGyYbleQU5X3 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-DEq0GGyYbleQU5X3 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-DEq0GGyYbleQU5X3 .error-icon{fill:#552222;}#mermaid-svg-DEq0GGyYbleQU5X3 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-DEq0GGyYbleQU5X3 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-DEq0GGyYbleQU5X3 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-DEq0GGyYbleQU5X3 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-DEq0GGyYbleQU5X3 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-DEq0GGyYbleQU5X3 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-DEq0GGyYbleQU5X3 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-DEq0GGyYbleQU5X3 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-DEq0GGyYbleQU5X3 .marker.cross{stroke:#333333;}#mermaid-svg-DEq0GGyYbleQU5X3 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-DEq0GGyYbleQU5X3 p{margin:0;}#mermaid-svg-DEq0GGyYbleQU5X3 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-DEq0GGyYbleQU5X3 .cluster-label text{fill:#333;}#mermaid-svg-DEq0GGyYbleQU5X3 .cluster-label span{color:#333;}#mermaid-svg-DEq0GGyYbleQU5X3 .cluster-label span p{background-color:transparent;}#mermaid-svg-DEq0GGyYbleQU5X3 .label text,#mermaid-svg-DEq0GGyYbleQU5X3 span{fill:#333;color:#333;}#mermaid-svg-DEq0GGyYbleQU5X3 .node rect,#mermaid-svg-DEq0GGyYbleQU5X3 .node circle,#mermaid-svg-DEq0GGyYbleQU5X3 .node ellipse,#mermaid-svg-DEq0GGyYbleQU5X3 .node polygon,#mermaid-svg-DEq0GGyYbleQU5X3 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-DEq0GGyYbleQU5X3 .rough-node .label text,#mermaid-svg-DEq0GGyYbleQU5X3 .node .label text,#mermaid-svg-DEq0GGyYbleQU5X3 .image-shape .label,#mermaid-svg-DEq0GGyYbleQU5X3 .icon-shape .label{text-anchor:middle;}#mermaid-svg-DEq0GGyYbleQU5X3 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-DEq0GGyYbleQU5X3 .rough-node .label,#mermaid-svg-DEq0GGyYbleQU5X3 .node .label,#mermaid-svg-DEq0GGyYbleQU5X3 .image-shape .label,#mermaid-svg-DEq0GGyYbleQU5X3 .icon-shape .label{text-align:center;}#mermaid-svg-DEq0GGyYbleQU5X3 .node.clickable{cursor:pointer;}#mermaid-svg-DEq0GGyYbleQU5X3 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-DEq0GGyYbleQU5X3 .arrowheadPath{fill:#333333;}#mermaid-svg-DEq0GGyYbleQU5X3 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-DEq0GGyYbleQU5X3 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-DEq0GGyYbleQU5X3 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-DEq0GGyYbleQU5X3 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-DEq0GGyYbleQU5X3 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-DEq0GGyYbleQU5X3 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-DEq0GGyYbleQU5X3 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-DEq0GGyYbleQU5X3 .cluster text{fill:#333;}#mermaid-svg-DEq0GGyYbleQU5X3 .cluster span{color:#333;}#mermaid-svg-DEq0GGyYbleQU5X3 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-DEq0GGyYbleQU5X3 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-DEq0GGyYbleQU5X3 rect.text{fill:none;stroke-width:0;}#mermaid-svg-DEq0GGyYbleQU5X3 .icon-shape,#mermaid-svg-DEq0GGyYbleQU5X3 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-DEq0GGyYbleQU5X3 .icon-shape p,#mermaid-svg-DEq0GGyYbleQU5X3 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-DEq0GGyYbleQU5X3 .icon-shape .label rect,#mermaid-svg-DEq0GGyYbleQU5X3 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-DEq0GGyYbleQU5X3 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-DEq0GGyYbleQU5X3 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-DEq0GGyYbleQU5X3 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 概念设计
识别实体
识别属性
识别关系
绘制E-R图
数据对象
实体特征
实体联系
概念模型

(二)E-R图的基本概念

E-R图要素:

要素 符号 说明
实体 矩形 数据对象
属性 椭圆 实体特征
关系 菱形 实体联系
联系类型 连线 1:1, 1:n, m:n

(三)联系类型

联系类型:

类型 说明 示例
一对一(1:1) 一个实体对应一个实体 一个人一个身份证
一对多(1:n) 一个实体对应多个实体 一个班级多个学生
多对多(m:n) 多个实体对应多个实体 学生选课

(四)E-R图示例

学生选课系统E-R图:
#mermaid-svg-lyLFrtIk6uC4yvJb{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-lyLFrtIk6uC4yvJb .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-lyLFrtIk6uC4yvJb .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-lyLFrtIk6uC4yvJb .error-icon{fill:#552222;}#mermaid-svg-lyLFrtIk6uC4yvJb .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-lyLFrtIk6uC4yvJb .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-lyLFrtIk6uC4yvJb .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-lyLFrtIk6uC4yvJb .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-lyLFrtIk6uC4yvJb .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-lyLFrtIk6uC4yvJb .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-lyLFrtIk6uC4yvJb .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-lyLFrtIk6uC4yvJb .marker{fill:#333333;stroke:#333333;}#mermaid-svg-lyLFrtIk6uC4yvJb .marker.cross{stroke:#333333;}#mermaid-svg-lyLFrtIk6uC4yvJb svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-lyLFrtIk6uC4yvJb p{margin:0;}#mermaid-svg-lyLFrtIk6uC4yvJb .entityBox{fill:#ECECFF;stroke:#9370DB;}#mermaid-svg-lyLFrtIk6uC4yvJb .relationshipLabelBox{fill:hsl(80, 100%, 96.2745098039%);opacity:0.7;background-color:hsl(80, 100%, 96.2745098039%);}#mermaid-svg-lyLFrtIk6uC4yvJb .relationshipLabelBox rect{opacity:0.5;}#mermaid-svg-lyLFrtIk6uC4yvJb .labelBkg{background-color:rgba(248.6666666666, 255, 235.9999999999, 0.5);}#mermaid-svg-lyLFrtIk6uC4yvJb .edgeLabel .label{fill:#9370DB;font-size:14px;}#mermaid-svg-lyLFrtIk6uC4yvJb .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-lyLFrtIk6uC4yvJb .edge-pattern-dashed{stroke-dasharray:8,8;}#mermaid-svg-lyLFrtIk6uC4yvJb .node rect,#mermaid-svg-lyLFrtIk6uC4yvJb .node circle,#mermaid-svg-lyLFrtIk6uC4yvJb .node ellipse,#mermaid-svg-lyLFrtIk6uC4yvJb .node polygon{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-lyLFrtIk6uC4yvJb .relationshipLine{stroke:#333333;stroke-width:1;fill:none;}#mermaid-svg-lyLFrtIk6uC4yvJb .marker{fill:none!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-lyLFrtIk6uC4yvJb .edgeLabel{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-lyLFrtIk6uC4yvJb .edgeLabel .label rect{fill:rgba(232,232,232, 0.8);}#mermaid-svg-lyLFrtIk6uC4yvJb .edgeLabel .label text{fill:#333;}#mermaid-svg-lyLFrtIk6uC4yvJb :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} makes
includes
STUDENT
string
student_id
PK
string
name
int
age
string
major
ENROLLMENT
string
enrollment_id
PK
string
student_id
FK
string
course_id
FK
date
enroll_date
decimal
score
COURSE
string
course_id
PK
string
name
int
credit

电商系统E-R图:
#mermaid-svg-gHw7oAa6flHQyNoi{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-gHw7oAa6flHQyNoi .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-gHw7oAa6flHQyNoi .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-gHw7oAa6flHQyNoi .error-icon{fill:#552222;}#mermaid-svg-gHw7oAa6flHQyNoi .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-gHw7oAa6flHQyNoi .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-gHw7oAa6flHQyNoi .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-gHw7oAa6flHQyNoi .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-gHw7oAa6flHQyNoi .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-gHw7oAa6flHQyNoi .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-gHw7oAa6flHQyNoi .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-gHw7oAa6flHQyNoi .marker{fill:#333333;stroke:#333333;}#mermaid-svg-gHw7oAa6flHQyNoi .marker.cross{stroke:#333333;}#mermaid-svg-gHw7oAa6flHQyNoi svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-gHw7oAa6flHQyNoi p{margin:0;}#mermaid-svg-gHw7oAa6flHQyNoi .entityBox{fill:#ECECFF;stroke:#9370DB;}#mermaid-svg-gHw7oAa6flHQyNoi .relationshipLabelBox{fill:hsl(80, 100%, 96.2745098039%);opacity:0.7;background-color:hsl(80, 100%, 96.2745098039%);}#mermaid-svg-gHw7oAa6flHQyNoi .relationshipLabelBox rect{opacity:0.5;}#mermaid-svg-gHw7oAa6flHQyNoi .labelBkg{background-color:rgba(248.6666666666, 255, 235.9999999999, 0.5);}#mermaid-svg-gHw7oAa6flHQyNoi .edgeLabel .label{fill:#9370DB;font-size:14px;}#mermaid-svg-gHw7oAa6flHQyNoi .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-gHw7oAa6flHQyNoi .edge-pattern-dashed{stroke-dasharray:8,8;}#mermaid-svg-gHw7oAa6flHQyNoi .node rect,#mermaid-svg-gHw7oAa6flHQyNoi .node circle,#mermaid-svg-gHw7oAa6flHQyNoi .node ellipse,#mermaid-svg-gHw7oAa6flHQyNoi .node polygon{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-gHw7oAa6flHQyNoi .relationshipLine{stroke:#333333;stroke-width:1;fill:none;}#mermaid-svg-gHw7oAa6flHQyNoi .marker{fill:none!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-gHw7oAa6flHQyNoi .edgeLabel{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-gHw7oAa6flHQyNoi .edgeLabel .label rect{fill:rgba(232,232,232, 0.8);}#mermaid-svg-gHw7oAa6flHQyNoi .edgeLabel .label text{fill:#333;}#mermaid-svg-gHw7oAa6flHQyNoi :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} places
contains
included_in
USER
string
user_id
PK
string
username
string
password
string
email
ORDER
string
order_id
PK
string
user_id
FK
date
order_date
decimal
total_amount
ORDER_ITEM
string
item_id
PK
string
order_id
FK
string
product_id
FK
int
quantity
decimal
price
PRODUCT
string
product_id
PK
string
name
decimal
price
int
stock

📊 四、逻辑设计

(一)逻辑设计的定义

逻辑设计是将概念模型转换为逻辑模型(关系模式)的过程。

逻辑设计概念:
#mermaid-svg-BXd2cafCgvcxK6PS{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-BXd2cafCgvcxK6PS .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-BXd2cafCgvcxK6PS .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-BXd2cafCgvcxK6PS .error-icon{fill:#552222;}#mermaid-svg-BXd2cafCgvcxK6PS .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-BXd2cafCgvcxK6PS .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-BXd2cafCgvcxK6PS .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-BXd2cafCgvcxK6PS .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-BXd2cafCgvcxK6PS .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-BXd2cafCgvcxK6PS .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-BXd2cafCgvcxK6PS .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-BXd2cafCgvcxK6PS .marker{fill:#333333;stroke:#333333;}#mermaid-svg-BXd2cafCgvcxK6PS .marker.cross{stroke:#333333;}#mermaid-svg-BXd2cafCgvcxK6PS svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-BXd2cafCgvcxK6PS p{margin:0;}#mermaid-svg-BXd2cafCgvcxK6PS .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-BXd2cafCgvcxK6PS .cluster-label text{fill:#333;}#mermaid-svg-BXd2cafCgvcxK6PS .cluster-label span{color:#333;}#mermaid-svg-BXd2cafCgvcxK6PS .cluster-label span p{background-color:transparent;}#mermaid-svg-BXd2cafCgvcxK6PS .label text,#mermaid-svg-BXd2cafCgvcxK6PS span{fill:#333;color:#333;}#mermaid-svg-BXd2cafCgvcxK6PS .node rect,#mermaid-svg-BXd2cafCgvcxK6PS .node circle,#mermaid-svg-BXd2cafCgvcxK6PS .node ellipse,#mermaid-svg-BXd2cafCgvcxK6PS .node polygon,#mermaid-svg-BXd2cafCgvcxK6PS .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-BXd2cafCgvcxK6PS .rough-node .label text,#mermaid-svg-BXd2cafCgvcxK6PS .node .label text,#mermaid-svg-BXd2cafCgvcxK6PS .image-shape .label,#mermaid-svg-BXd2cafCgvcxK6PS .icon-shape .label{text-anchor:middle;}#mermaid-svg-BXd2cafCgvcxK6PS .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-BXd2cafCgvcxK6PS .rough-node .label,#mermaid-svg-BXd2cafCgvcxK6PS .node .label,#mermaid-svg-BXd2cafCgvcxK6PS .image-shape .label,#mermaid-svg-BXd2cafCgvcxK6PS .icon-shape .label{text-align:center;}#mermaid-svg-BXd2cafCgvcxK6PS .node.clickable{cursor:pointer;}#mermaid-svg-BXd2cafCgvcxK6PS .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-BXd2cafCgvcxK6PS .arrowheadPath{fill:#333333;}#mermaid-svg-BXd2cafCgvcxK6PS .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-BXd2cafCgvcxK6PS .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-BXd2cafCgvcxK6PS .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-BXd2cafCgvcxK6PS .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-BXd2cafCgvcxK6PS .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-BXd2cafCgvcxK6PS .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-BXd2cafCgvcxK6PS .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-BXd2cafCgvcxK6PS .cluster text{fill:#333;}#mermaid-svg-BXd2cafCgvcxK6PS .cluster span{color:#333;}#mermaid-svg-BXd2cafCgvcxK6PS div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-BXd2cafCgvcxK6PS .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-BXd2cafCgvcxK6PS rect.text{fill:none;stroke-width:0;}#mermaid-svg-BXd2cafCgvcxK6PS .icon-shape,#mermaid-svg-BXd2cafCgvcxK6PS .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-BXd2cafCgvcxK6PS .icon-shape p,#mermaid-svg-BXd2cafCgvcxK6PS .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-BXd2cafCgvcxK6PS .icon-shape .label rect,#mermaid-svg-BXd2cafCgvcxK6PS .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-BXd2cafCgvcxK6PS .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-BXd2cafCgvcxK6PS .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-BXd2cafCgvcxK6PS :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 逻辑设计
E-R图转换
关系模式
规范化
实体转换
关系转换
表结构
消除冗余

(二)E-R图转换规则

转换规则:

规则 说明
实体转换 每个实体转换为一个关系
1:1关系 合并或添加外键
1:n关系 在n端添加外键
m:n关系 创建新关系

(三)关系模式设计

关系模式示例:

sql 复制代码
-- 学生表
CREATE TABLE students (
    student_id VARCHAR(32) PRIMARY KEY,
    name VARCHAR(50) NOT NULL,
    age INT,
    major VARCHAR(50)
);

-- 课程表
CREATE TABLE courses (
    course_id VARCHAR(32) PRIMARY KEY,
    name VARCHAR(100) NOT NULL,
    credit INT
);

-- 选课表(多对多关系)
CREATE TABLE enrollments (
    enrollment_id VARCHAR(32) PRIMARY KEY,
    student_id VARCHAR(32) NOT NULL,
    course_id VARCHAR(32) NOT NULL,
    enroll_date DATE,
    score DECIMAL(5,2),
    FOREIGN KEY (student_id) REFERENCES students(student_id),
    FOREIGN KEY (course_id) REFERENCES courses(course_id)
);

(四)规范化

规范化:

通过规范化消除数据冗余。

规范化范式:

范式 说明 要求
1NF 第一范式 属性不可分
2NF 第二范式 消除部分依赖
3NF 第三范式 消除传递依赖
BCNF BC范式 消除主属性依赖

规范化示例:

复制代码
// 非规范化
学生表:学号,姓名,课程名,成绩,教师名

// 1NF:属性不可分
学生表:学号,姓名,{课程名,成绩,教师名}

// 2NF:消除部分依赖
学生表:学号,姓名
选课表:学号,课程名,成绩,教师名

// 3NF:消除传递依赖
学生表:学号,姓名
课程表:课程名,教师名
选课表:学号,课程名,成绩

💡 五、物理设计

(一)物理设计的定义

物理设计是将逻辑模型转换为物理模型的过程。

物理设计概念:
#mermaid-svg-3p65DEbegPRLl2dI{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-3p65DEbegPRLl2dI .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-3p65DEbegPRLl2dI .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-3p65DEbegPRLl2dI .error-icon{fill:#552222;}#mermaid-svg-3p65DEbegPRLl2dI .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-3p65DEbegPRLl2dI .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-3p65DEbegPRLl2dI .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-3p65DEbegPRLl2dI .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-3p65DEbegPRLl2dI .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-3p65DEbegPRLl2dI .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-3p65DEbegPRLl2dI .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-3p65DEbegPRLl2dI .marker{fill:#333333;stroke:#333333;}#mermaid-svg-3p65DEbegPRLl2dI .marker.cross{stroke:#333333;}#mermaid-svg-3p65DEbegPRLl2dI svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-3p65DEbegPRLl2dI p{margin:0;}#mermaid-svg-3p65DEbegPRLl2dI .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-3p65DEbegPRLl2dI .cluster-label text{fill:#333;}#mermaid-svg-3p65DEbegPRLl2dI .cluster-label span{color:#333;}#mermaid-svg-3p65DEbegPRLl2dI .cluster-label span p{background-color:transparent;}#mermaid-svg-3p65DEbegPRLl2dI .label text,#mermaid-svg-3p65DEbegPRLl2dI span{fill:#333;color:#333;}#mermaid-svg-3p65DEbegPRLl2dI .node rect,#mermaid-svg-3p65DEbegPRLl2dI .node circle,#mermaid-svg-3p65DEbegPRLl2dI .node ellipse,#mermaid-svg-3p65DEbegPRLl2dI .node polygon,#mermaid-svg-3p65DEbegPRLl2dI .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-3p65DEbegPRLl2dI .rough-node .label text,#mermaid-svg-3p65DEbegPRLl2dI .node .label text,#mermaid-svg-3p65DEbegPRLl2dI .image-shape .label,#mermaid-svg-3p65DEbegPRLl2dI .icon-shape .label{text-anchor:middle;}#mermaid-svg-3p65DEbegPRLl2dI .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-3p65DEbegPRLl2dI .rough-node .label,#mermaid-svg-3p65DEbegPRLl2dI .node .label,#mermaid-svg-3p65DEbegPRLl2dI .image-shape .label,#mermaid-svg-3p65DEbegPRLl2dI .icon-shape .label{text-align:center;}#mermaid-svg-3p65DEbegPRLl2dI .node.clickable{cursor:pointer;}#mermaid-svg-3p65DEbegPRLl2dI .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-3p65DEbegPRLl2dI .arrowheadPath{fill:#333333;}#mermaid-svg-3p65DEbegPRLl2dI .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-3p65DEbegPRLl2dI .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-3p65DEbegPRLl2dI .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-3p65DEbegPRLl2dI .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-3p65DEbegPRLl2dI .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-3p65DEbegPRLl2dI .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-3p65DEbegPRLl2dI .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-3p65DEbegPRLl2dI .cluster text{fill:#333;}#mermaid-svg-3p65DEbegPRLl2dI .cluster span{color:#333;}#mermaid-svg-3p65DEbegPRLl2dI div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-3p65DEbegPRLl2dI .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-3p65DEbegPRLl2dI rect.text{fill:none;stroke-width:0;}#mermaid-svg-3p65DEbegPRLl2dI .icon-shape,#mermaid-svg-3p65DEbegPRLl2dI .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-3p65DEbegPRLl2dI .icon-shape p,#mermaid-svg-3p65DEbegPRLl2dI .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-3p65DEbegPRLl2dI .icon-shape .label rect,#mermaid-svg-3p65DEbegPRLl2dI .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-3p65DEbegPRLl2dI .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-3p65DEbegPRLl2dI .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-3p65DEbegPRLl2dI :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 物理设计
存储设计
索引设计
分区设计
存储结构
索引结构
分区策略

(二)存储设计

存储设计:

设计数据的存储结构。

存储方式:

方式 说明 适用场景
堆文件 无序存储 简单存储
顺序文件 有序存储 顺序访问
散列文件 散列存储 快速查找
索引文件 索引存储 快速查找

(三)索引设计

索引设计:

设计数据库索引。

索引类型:

类型 说明 适用场景
主键索引 主键索引 唯一标识
唯一索引 唯一值索引 唯一约束
普通索引 普通索引 加速查询
复合索引 多列索引 多条件查询
全文索引 全文检索 文本搜索

索引设计示例:

sql 复制代码
-- 主键索引(自动创建)
CREATE TABLE users (
    user_id VARCHAR(32) PRIMARY KEY,
    username VARCHAR(50) NOT NULL
);

-- 唯一索引
CREATE UNIQUE INDEX idx_username ON users(username);

-- 普通索引
CREATE INDEX idx_email ON users(email);

-- 复合索引
CREATE INDEX idx_name_age ON users(name, age);

(四)分区设计

分区设计:

将数据分区存储。

分区策略:

策略 说明 适用场景
范围分区 按范围分区 日期数据
列表分区 按列表分区 类别数据
哈希分区 按哈希分区 均匀分布
复合分区 组合分区 复杂场景

分区示例:

sql 复制代码
-- 范围分区
CREATE TABLE orders (
    order_id VARCHAR(32),
    order_date DATE,
    amount DECIMAL(10,2)
) PARTITION BY RANGE (YEAR(order_date)) (
    PARTITION p2022 VALUES LESS THAN (2023),
    PARTITION p2023 VALUES LESS THAN (2024),
    PARTITION p2024 VALUES LESS THAN (2025)
);

📋 六、数据库设计实例

(一)实例背景

项目:电商系统数据库设计

数据需求:

  • 用户管理
  • 商品管理
  • 订单管理
  • 支付管理

(二)需求分析

数据需求:

数据 说明
用户信息 用户基本信息
商品信息 商品基本信息
订单信息 订单基本信息
订单明细 订单商品信息
支付信息 支付基本信息

(三)概念设计

E-R图:
#mermaid-svg-x0bHprQFFYDxd5y4{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-x0bHprQFFYDxd5y4 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-x0bHprQFFYDxd5y4 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-x0bHprQFFYDxd5y4 .error-icon{fill:#552222;}#mermaid-svg-x0bHprQFFYDxd5y4 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-x0bHprQFFYDxd5y4 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-x0bHprQFFYDxd5y4 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-x0bHprQFFYDxd5y4 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-x0bHprQFFYDxd5y4 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-x0bHprQFFYDxd5y4 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-x0bHprQFFYDxd5y4 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-x0bHprQFFYDxd5y4 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-x0bHprQFFYDxd5y4 .marker.cross{stroke:#333333;}#mermaid-svg-x0bHprQFFYDxd5y4 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-x0bHprQFFYDxd5y4 p{margin:0;}#mermaid-svg-x0bHprQFFYDxd5y4 .entityBox{fill:#ECECFF;stroke:#9370DB;}#mermaid-svg-x0bHprQFFYDxd5y4 .relationshipLabelBox{fill:hsl(80, 100%, 96.2745098039%);opacity:0.7;background-color:hsl(80, 100%, 96.2745098039%);}#mermaid-svg-x0bHprQFFYDxd5y4 .relationshipLabelBox rect{opacity:0.5;}#mermaid-svg-x0bHprQFFYDxd5y4 .labelBkg{background-color:rgba(248.6666666666, 255, 235.9999999999, 0.5);}#mermaid-svg-x0bHprQFFYDxd5y4 .edgeLabel .label{fill:#9370DB;font-size:14px;}#mermaid-svg-x0bHprQFFYDxd5y4 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-x0bHprQFFYDxd5y4 .edge-pattern-dashed{stroke-dasharray:8,8;}#mermaid-svg-x0bHprQFFYDxd5y4 .node rect,#mermaid-svg-x0bHprQFFYDxd5y4 .node circle,#mermaid-svg-x0bHprQFFYDxd5y4 .node ellipse,#mermaid-svg-x0bHprQFFYDxd5y4 .node polygon{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-x0bHprQFFYDxd5y4 .relationshipLine{stroke:#333333;stroke-width:1;fill:none;}#mermaid-svg-x0bHprQFFYDxd5y4 .marker{fill:none!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-x0bHprQFFYDxd5y4 .edgeLabel{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-x0bHprQFFYDxd5y4 .edgeLabel .label rect{fill:rgba(232,232,232, 0.8);}#mermaid-svg-x0bHprQFFYDxd5y4 .edgeLabel .label text{fill:#333;}#mermaid-svg-x0bHprQFFYDxd5y4 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} places
contains
included_in
has
USER
string
user_id
PK
string
username
string
password
string
email
string
phone
ORDER
string
order_id
PK
string
user_id
FK
date
order_date
decimal
total_amount
string
status
ORDER_ITEM
string
item_id
PK
string
order_id
FK
string
product_id
FK
int
quantity
decimal
price
PRODUCT
string
product_id
PK
string
name
decimal
price
int
stock
string
description
PAYMENT
string
payment_id
PK
string
order_id
FK
decimal
amount
string
payment_method
date
payment_date
string
status

(四)逻辑设计

关系模式:

sql 复制代码
-- 用户表
CREATE TABLE users (
    user_id VARCHAR(32) PRIMARY KEY,
    username VARCHAR(50) NOT NULL UNIQUE,
    password VARCHAR(100) NOT NULL,
    email VARCHAR(100),
    phone VARCHAR(20),
    create_time DATETIME DEFAULT CURRENT_TIMESTAMP
);

-- 商品表
CREATE TABLE products (
    product_id VARCHAR(32) PRIMARY KEY,
    name VARCHAR(100) NOT NULL,
    price DECIMAL(10,2) NOT NULL,
    stock INT DEFAULT 0,
    description TEXT,
    create_time DATETIME DEFAULT CURRENT_TIMESTAMP
);

-- 订单表
CREATE TABLE orders (
    order_id VARCHAR(32) PRIMARY KEY,
    user_id VARCHAR(32) NOT NULL,
    order_date DATETIME DEFAULT CURRENT_TIMESTAMP,
    total_amount DECIMAL(10,2) NOT NULL,
    status VARCHAR(20) DEFAULT 'pending',
    FOREIGN KEY (user_id) REFERENCES users(user_id)
);

-- 订单明细表
CREATE TABLE order_items (
    item_id VARCHAR(32) PRIMARY KEY,
    order_id VARCHAR(32) NOT NULL,
    product_id VARCHAR(32) NOT NULL,
    quantity INT NOT NULL,
    price DECIMAL(10,2) NOT NULL,
    FOREIGN KEY (order_id) REFERENCES orders(order_id),
    FOREIGN KEY (product_id) REFERENCES products(product_id)
);

-- 支付表
CREATE TABLE payments (
    payment_id VARCHAR(32) PRIMARY KEY,
    order_id VARCHAR(32) NOT NULL UNIQUE,
    amount DECIMAL(10,2) NOT NULL,
    payment_method VARCHAR(20) NOT NULL,
    payment_date DATETIME,
    status VARCHAR(20) DEFAULT 'pending',
    FOREIGN KEY (order_id) REFERENCES orders(order_id)
);

(五)物理设计

索引设计:

sql 复制代码
-- 用户表索引
CREATE INDEX idx_username ON users(username);
CREATE INDEX idx_email ON users(email);

-- 商品表索引
CREATE INDEX idx_product_name ON products(name);
CREATE INDEX idx_product_price ON products(price);

-- 订单表索引
CREATE INDEX idx_order_user ON orders(user_id);
CREATE INDEX idx_order_date ON orders(order_date);
CREATE INDEX idx_order_status ON orders(status);

-- 订单明细表索引
CREATE INDEX idx_item_order ON order_items(order_id);
CREATE INDEX idx_item_product ON order_items(product_id);

-- 支付表索引
CREATE INDEX idx_payment_order ON payments(order_id);
CREATE INDEX idx_payment_date ON payments(payment_date);

📝 总结

数据库设计是软件设计的重要组成部分,决定了系统的数据存储架构。

🎯 设计定义:确定数据库的结构、约束和关系的过程。

📦 设计步骤:

  • 需求分析:分析数据需求
  • 概念设计:设计E-R图
  • 逻辑设计:设计关系模式
  • 物理设计:设计物理模式
  • 数据库实施:创建数据库
  • 运行维护:维护优化

🌐 概念设计:使用E-R图表示概念模型,包括实体、属性、关系。联系类型:一对一(1:1)、一对多(1:n)、多对多(m:n)。

💡 逻辑设计:将E-R图转换为关系模式。遵循规范化原则(1NF、2NF、3NF、BCNF),消除数据冗余。

📋 物理设计:设计存储结构、索引结构、分区策略。优化查询性能。


核心启示:数据库设计是软件设计的基础,"万丈高楼平地起",良好的数据库设计是构建高质量软件的基础。在实际工作中,我们需要注意:第一,充分分析数据需求,确保设计满足业务需求;第二,合理设计E-R图,准确表达实体关系;第三,遵循规范化原则,消除数据冗余;第四,合理设计索引,优化查询性能;第五,考虑扩展性,为未来发展留有余地。数据库设计是一项需要扎实理论基础和丰富实践经验的工作。通过合理的数据库设计,我们可以构建出高效、可靠、可扩展的数据存储架构,为软件系统的成功奠定基础。记住:好的数据库设计是软件成功的一半。


相关推荐
这个DBA有点耶2 天前
MVCC深入:Read View、版本链与快照读——InnoDB并发控制的内核
数据库·mysql·架构
DBA_G2 天前
从地面到云霄:GBase数据库在民航三大场景的落地实践
数据库
自由能燃气设备2 天前
商用全预混低氮冷凝锅炉免费方案vs付费方案对比+选型避坑指南
大数据·数据库·人工智能
科创致远2 天前
科创致远 ESOP 系统核心效能与实战价值展示
大数据·数据库·人工智能·精益工程
盖伦发发3 天前
软件工程SOLID 五大设计原则
后端·软件工程
2601_962218613 天前
万象生鲜系统称重自动多退少补算法解决生鲜非标品痛点
大数据·数据库·人工智能·python·算法
张洛闻Eren3 天前
k8s云原生【第十课】:水平 Pod 自动扩缩容
运维·数据库·云原生·kubernetes·github
于平安3 天前
MySQL-触发器
数据库·mysql
白远山3 天前
上海24小时自助健身房解决方案实战指南与经验分享
java·数据库·架构·需求分析
Omics Pro3 天前
斯坦福Nature+Science|广义虚拟细胞基础大模型
数据库·人工智能·算法·机器学习·自然语言处理