欢迎光临
我们一直在努力

软件工程:数据库设计

📌目录

  • ⚖️ 数据库设计:构建高效数据存储的基石
    • 🎯 一、数据库设计概述
      • (一)数据库设计的定义
      • (二)数据库设计的地位
      • (三)数据库设计的意义
    • 📦 二、数据库设计的步骤
      • (一)设计步骤
      • (二)需求分析
    • 🌐 三、概念设计
      • (一)概念设计的定义
      • (二)E-R图的基本概念
      • (三)联系类型
      • (四)E-R图示例
    • 📊 四、逻辑设计
      • (一)逻辑设计的定义
      • (二)E-R图转换规则
      • (三)关系模式设计
      • (四)规范化
    • 💡 五、物理设计
      • (一)物理设计的定义
      • (二)存储设计
      • (三)索引设计
      • (四)分区设计
    • 📋 六、数据库设计实例
      • (一)实例背景
      • (二)需求分析
      • (三)概念设计
      • (四)逻辑设计
      • (五)物理设计
    • 📝 总结

在这里插入图片描述


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

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

在这里插入图片描述

🎯 一、数据库设计概述

(一)数据库设计的定义

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

数据库设计概念:

#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关系 创建新关系

(三)关系模式设计

关系模式示例:

— 学生表
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;}

物理设计

存储设计

索引设计

分区设计

存储结构

索引结构

分区策略

(二)存储设计

存储设计:

设计数据的存储结构。

存储方式:

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

(三)索引设计

索引设计:

设计数据库索引。

索引类型:

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

索引设计示例:

— 主键索引(自动创建)
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);

(四)分区设计

分区设计:

将数据分区存储。

分区策略:

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

分区示例:

— 范围分区
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

(四)逻辑设计

关系模式:

— 用户表
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)
);

(五)物理设计

索引设计:

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


赞(0)
未经允许不得转载:171主机测评 » 软件工程:数据库设计
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址