📌目录
- [⚖️ 数据库设计:构建高效数据存储的基石](#⚖️ 数据库设计:构建高效数据存储的基石)
-
- [🎯 一、数据库设计概述](#🎯 一、数据库设计概述)
- [📦 二、数据库设计的步骤](#📦 二、数据库设计的步骤)
- [🌐 三、概念设计](#🌐 三、概念设计)
- [📊 四、逻辑设计](#📊 四、逻辑设计)
- [💡 五、物理设计](#💡 五、物理设计)
- [📋 六、数据库设计实例](#📋 六、数据库设计实例)
- [📝 总结](#📝 总结)

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

🎯 一、数据库设计概述
(一)数据库设计的定义
数据库设计是确定数据库的结构、约束和关系的过程,是软件设计的重要组成部分。
数据库设计概念:
#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图,准确表达实体关系;第三,遵循规范化原则,消除数据冗余;第四,合理设计索引,优化查询性能;第五,考虑扩展性,为未来发展留有余地。数据库设计是一项需要扎实理论基础和丰富实践经验的工作。通过合理的数据库设计,我们可以构建出高效、可靠、可扩展的数据存储架构,为软件系统的成功奠定基础。记住:好的数据库设计是软件成功的一半。