软件工程:数据库设计

📌目录



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

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

🎯 一、数据库设计概述

(一)数据库设计的定义

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

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


相关推荐
10mAh1 小时前
【Git】误删分支、reset --hard 后提交丢了怎么办?——reflog、fsck 与安全恢复实战
数据库·git·安全·回归
J_bean1 小时前
剖析 MySQL InnoDB 共享行锁 (S) & 排他行锁 (X)
数据库·mysql·共享行锁·s lock·排他行锁·x lock
Lumistory1 小时前
城市景观亮化设施维护管养的核心痛点与标准化解决方案
数据库·光照贴图
倒流时光三十年1 小时前
第六阶段 57 · ES|QL 与 SQL API(用 SQL 查 ES)
数据库·sql·elasticsearch
努力进修2 小时前
“数据心脏” 驱动能源自主:国产数据库支撑 Cemsol 实现固井全流程数字化闭环
数据库·人工智能·能源
vHelios2 小时前
SQL不会写?不会找关联表?复杂SQL语句编写逻辑实现思路请查收✉
数据库·sql
DB哥讲数据库3 小时前
【ClickHouse安装教程】从零开始部署高性能列式数据库(附ClickHouse安装包)
数据库·clickhouse
TDengine (老段)3 小时前
TDengine 第三方工具 — Telegraf、Kafka Connect、Flink、Spark
大数据·数据库·物联网·flink·kafka·时序数据库·tdengine
小白勇闯网安圈12 小时前
Django 响应对象、文件上传与类视图
数据库·django·sqlite