数据库系统概念:第七章E-R模型

CH7 Entity-Relationship Model

文章目录


如何设计数据库? —— 关注E-R数据模型。提供了找出在数据库中表示的 实体以及 实体间如何关联的方法。

image-20211030194706789

经过上述方法,
数 据 库 设 计 最 终 表 示 { 关 系 数 据 库 设 计 与 之 关 联 的 约 束 集 合 数据库设计最终表示\begin{cases} 关系数据库设计\\ 与之关联的约束集合 \end{cases} {
数据库设计的内容:
数 据 库 设 计 概 念 { C H 7 : { 概 念 设 计 : E − R 设 计 如 何 转 换 为 关 系 模 式 的 集 合 如 何 在 设 计 中 找 到 与 之 关 联 的 约 束 集 合 C H 8 : { 关 系 模 式 是 否 是 一 个 好 / 不 好 的 设 计 构 建 更 好 的 设 计 数据库设计概念\begin{cases} CH7:\begin{cases}概念设计:E-R设计如何转换为关系模式的集合\\如何在设计中找到与之关联的约束集合 \end{cases} \\ CH8:\begin{cases} 关系模式是否是一个好/不好的设计\\ 构建更好的设计 \end{cases} \end{cases} CH7:{ERCH8:{/

7.1 设计过程概览

数据库设计内容较多,主要有以下几个部分:

  • 设计数据库模式
  • 设计访问
  • 更新数据的程序
  • 设计控制数据访问的安全模式
7.1.1 设计阶段

a. 刻画数据需求:沟通

b. 选择数据模型:需求转换为数据库概念模式
概 念 设 计 : 将 需 求 转 换 为 数 据 库 概 念 模 式 概念设计:将需求转换为数据库概念模式
本章使用的概念设计的E-R模型

c. 指明功能需求:

根据用户对于数据的增删查改操作,检查所设计的模式,确保其满足供能需求。

7.1.2 设计选择

数据库设计的主要部分:如何在设计中表示各种实体。

多个实体之间存在多种方式的联系。
数 据 库 设 计 需 要 避 免 的 缺 陷 : { 冗 余 { e . g . 每 次 开 课 均 存 储 【 课 程 编 号 】 和 【 课 程 名 称 】 : 课 程 名 称 可 与 课 程 编 号 关 联 一 次 就 够 了 问 题 : 信 息 更 新 造 成 数 据 不 一 致 问 题 不 完 整 数据库设计需要避免的缺陷: \begin{cases} 冗余\begin{cases}e.g.每次开课均存储【课程编号】和【课程名称】:课程名称可与课程编号关联一次就够了\\ 问题:信息更新造成数据不一致问题\end{cases}\\ 不完整\\ \end{cases} {e.g.

7.2 实体-联系模型

E-R模型旨在方便数据可的设计,通过允许定义代表数据库全局逻辑结构的企业模式实现的。

实体联系模型将【现实世界企业的含义】映射到【概念模型

7.2.1 实体集
  • 实体:实体是现实世界中存在且区别于其他对象的一个“事务”或“对象”。

  • 实体集:相同类型(具有相同属性)的实体构成的集合。

    instructor为大学里的所有教师构成的集合

    实体集不必互不相交:一个人可以属于多个实体集,也可以不属于任何一个实体集

  • 属性:实体通过一组属性来表示——实体通过在属性上取值的不同而区别于其他的实体。

    属性是刻画实体的角度,是每个成员拥有的描述性性质。

7.2.2 联系集
1.联系与联系集的概念

联系:多个实体间的相互关联。多个实体间的相互关联。

联系集相同类型联系的集合。n>=2个实体集上的数学关系。

如果 E 1 , E 2 , . . . , E n E_1,E_2,...,E_n E1,E2,...,En是实体集,那么联系集R是: { ( e 1 , e 2 , . . . , e n ) ∣ e 1 ∈ E 1 , e 2 ∈ E 2 , . . . , e n ∈ E n } \{(e_1,e_2,...,e_n)|e_1\in E_1,e_2\in E_2,...,e_n\in E_n\} {(e1,e2,...,en)e1E1,e2E2,...,enEn}的一个子集, ( e 1 , e 2 , . . . , e n ) (e_1,e_2,...,e_n) (e1,e2,...,en)是一个联系。

下图为联系集advisor:

image-20211030224310763
2.实体参与联系集

参与:实体集之间的关联称为【参与】:实体集 E 1 , E 2 , . . . , E n E_1,E_2,...,E_n E1,E2,...,En参与联系集R。

image-20211031085227294

一个联系实例表示现实世界中的命名实体间的一个关联。

3.角色

角色:实体在联系中扮演的功能。

同样的实体集可以以不同的角色参与一个联系集多于一次。

image-20211031085334154

这种情况称自环的联系集。需要用显式的角色名来指明实体是如何参与联系集的。

比如用course来建模联系集prereq,以一门课程C2来描述另一门课程C2的先修课。那么C1具有课程的角色,C2具有先修课的角色。即一个相同的实体集以不同的角色参与了一个联系集多于一次。同时,所有的prereq联系通过 ( C 1 , C 2 ) (C1,C2) (C1,C2)表示,而排除了 ( C 2 , C 1 ) (C2,C1) (C2,C1)

4.联系集的属性描述

联系的描述性属性:教师和学生之间的联系通过时间date关联。

  • advisor联系:可以将属性与date关联起来,以表示教师成为该学生导师的日期。

    image-20211031091225344

  • student和section参与的一个联系集takes,用grade来描述学生这门课取得的成绩。

联系实例必须是由参与实体唯一标识的,而不必使用描述属性。比如若一个老师在多个日期成为一个学生的导师,那么我们不能建立多个联系来表示日期。因为这样使用参与的实体是无法标识的。正确的方法是创建一个多值属性date。

5.n元联系集

advisor和dept_advisor是一个二元联系集合。

二元联系集:涉及两个实体的联系集

参与联系集的实体集的个数称为联系集的。二元联系集的度为2,三元联系集的度为3。

7.2.3属性
1.属性

属性:刻画实体的一个角度
{ 单 值 属 性 和 多 值 属 性 { S i n g l e − v a l u e d m u l t i − v a l u e d 派 生 属 性 : 可 以 由 其 他 的 属 性 计 算 而 来 , 比 如 年 龄 可 由 出 生 年 月 日 决 定 \begin{cases} 单值属性和多值属性\begin{cases}Single-valued\\multi-valued\end{cases}\\ 派生属性:可以由其他的属性计算而来,比如年龄可由出生年月日决定 \end{cases} {Singlevaluedmultivalued
每个属性都有可以取的值的集合,称为该属性的,或者值集。

  • course_id值集为特定长的所有文本字符串的集合
  • semester值集为{Spring, Summer, Fall, Winter}
2.属性的域

实体集的属性是将实体集映射到域的函数。

对instructor实体集可以这样描述:
{ ( I D , 76766 ) , ( n a m e , C r i k ) , ( d e p t n a m e , 生 物 ) , ( s a l a r y , 72000 ) } \{(ID,76766),(name, Crik),(dept_name,生物),(salary,72000)\} {(ID,76766),(name,Crik),(deptname,),(salary,72000)}

3.属性类型的分类

法1:
简 单 和 符 合 属 性 { 简 单 属 性 : 不 能 被 分 成 更 小 的 部 分 复 合 属 性 : 可 以 划 分 成 更 小 的 部 分 : { 姓 名 = 姓 + 名 地 址 = s t r e e t + c i t y + z i p _ c o d e 简单和符合属性\begin{cases}简单属性:不能被分成更小的部分\\复合属性:可以划分成更小的部分:\begin{cases}姓名=姓+名\\地址=street+city+zip\_code\end{cases}\end{cases} {=+=street+city+zip_code
复合属性是具有层次的:

image-20211031102529857

法2:
单 值 属 性 和 多 值 属 性 { 单 值 属 性 : 一 个 属 性 对 于 一 个 实 体 只 有 一 个 值 。 如 I D 多 值 属 性 : 一 个 属 性 可 能 对 应 多 个 值 。 如 P h o n e _ n u m b e r 单值属性和多值属性\begin{cases}单值属性:一个属性对于一个实体只有一个值。如ID\\多值属性:一个属性可能对应多个值。如Phone\_number\end{cases} {IDPhone_number
法3:

派生属性:这类属性可以从别的相关属性或者实体中派生出来

如年龄可以从出生年月中计算出来。

4.属性的null

属性的null可以表示多重含义:

  • 缺失
  • 未知
  • 不适用

7.3 约束

7.3.1 映射基数

映射基数(mapping cardinality),或者映射比率:一个实体通过一个联系集关联的实体的个数

二元联系集有下面几种情况:

  • 一对一

    A中实体至多与B中一个实体相关联。B中的实体也至多与A中的一个实体关联。

    image-20211031104258467

  • 一对多

    A中的实体可以与B中的任意数目个实体相关联。而B中的一个实体至多与A中的一个实体相关联。

    image-20211031104347743

  • 多对一

    A中的一个实体至多与B中的一个实体相关联,而B中的一个实体可以与A中的任意个实体相关联。

    image-20211031104458802

  • 多对多

    A中的一个实体可以与B中的任意多个实体相关联,B中的一个实体也可以与A中的任意多个实体相关联。

image-20211031151718757

7.3.2 参与约束

全部参与:实体集中的每个实体都参与到联系集R的至少一个联系中

部分参与:实体集E只有部分参与到R的联系集中

例:对于advisor关系,每个学生通过advisor联系同至少一个教师联系,因而student在联系集advisor中的参与是全部的。但是并不是所有的instructor都要指导一名学生,所以instructor在advisor中的参与是部分的。

7.3.3 码
1.实体集与码

实体集中不允许两个实体在所有属性上的取值完全相同。

实体的码是一个足以区分每个实体的属性集

2.联系集与码

码可以唯一的标识联系,将联系区分开来。

联系的码的概念

设R是一个涉及实体集 E 1 , E 2 , . . . , E n E_1,E_2,...,E_n E1,E2,...,En的联系集。设主码 ( E i ) (E_i) (Ei)代表构成实体集 E i E_i Ei的主码的属性集合。

联系集的主码依赖于同联系集R相关联的属性集合:

  • 如果联系集没有属性与之关联,那么属性集合
    primary-key ( E 1 ) ⋃ primary-key ( E 2 ) ⋃ . . . ⋃ primary-key ( E n ) \text{primary-key}(E_1)\bigcup\text{primary-key}(E_2)\bigcup...\bigcup\text{primary-key}(E_n) primary-key(E1)primary-key(E2)...primary-key(En)
    描述了R中的一个联系。

  • 如果联系集有属性与之关系,那么属性集合
    primary-key ( E 1 ) ⋃ primary-key ( E 2 ) ⋃ . . . ⋃ primary-key ( E n ) ⋃ { a 1 , a 2 , . . . , a m } \text{primary-key}(E_1)\bigcup\text{primary-key}(E_2)\bigcup...\bigcup\text{primary-key}(E_n)\bigcup\{a_1,a_2,...,a_m\} primary-key(E1)primary-key(E2)...primary-key(En){a1,a2,...,am}
    描述了R中的一个联系

在以上两种情况下,属性集合
primary-key ( E 1 ) ⋃ primary-key ( E 2 ) ⋃ . . . ⋃ primary-key ( E n ) \text{primary-key}(E_1)\bigcup\text{primary-key}(E_2)\bigcup...\bigcup\text{primary-key}(E_n) primary-key(E1)primary-key(E2)...primary-key(En)
构成了联系集的一个超码

联系集的主码结构

联系集的主码结构依赖于联系集的映射基数。以instructor和student的advisor关系说明下面三种情况下的联系集的主码:

  • 多对多:主码为instructor和student的主码的并集
  • 一对多:一个学生最多由一个instructor指导,主码为student的主码
  • 多对一:一个学生可由多个instructor指导,但是一个instructor只能指导一个student,主码为instructor的主码

7.4从实体集中删除冗余属性

从确定的实体集开始确定属性。具体的属性的选择取决于了解企业结构的设计者。

例:instructor和department中,instructor需要指明是隶属于哪个department的。有下面的属性关系:

  • instructor :ID,name,dept_name,salary,主码为ID
  • department:dept_name,building,budget,主码为dept_name

dept_name在两个属性集中都出现了,由于在department中dept_name是主码,所以其在instructor中赘余,需要去除。

实际上,如果不去除的情况,只出现在一个instructor只与一个系关联的时候,dept_name才会放到instructor中。若一个instructor与多个系关联,那么教师与系之间的联系会记录在一个单独的表中

将教师与系的关联设计成一个联系,而不是instructor的一个属性,有利于避免过早的假设每个教师只与一个系关联。

7.5 实体-联系图

7.5.1 基本结构
  • 实体:分隔的矩形表示。阴影部分表示实体集的名字。第二部分包含实体集中的所有属性的名字。
  • 菱形:联系集
  • 未分割的矩形:联系集的属性
  • 线段:将实体集连接到联系集
  • 虚线:联系集属性连接到联系集
  • 双线:实体在联系集中的参与度
  • 双菱形:连接到弱实体集的标志性联系集

例:

image-20211031211615977

7.5.2 映射基数
1.基本表示方法

映射基数有一对一,一对多,多对一,多对多四种情况。

多: ← o r → \leftarrow or \rightarrow or表示

一: — — 表示

image-20211031212309651
2.复杂约束方法

二元联系集的一条边可以由关联的最大和最小的映射基数。以 l . . . . . . h l......h l......h的形式表示。

  • l . . . . . . h l......h l......h
    • l : l i m i t l:limit l:limit最小映射基数
    • h : h i g h e s t h:highest h:highest最大映射基数
    • ∗ : *: 没有限制
  • 最值说明:
    • 最小值为1表示这个实体集中的每个实体在该联系中全部参与
    • 最大值为1表示这个实体集中的每个实体都至多参与一个联系
    • 最大值为 ∗ * 表示没有限制

表示法如下:

image-20211031221705611

上述图片描述的是:从Instructor到student的一对多的关系(易错)

同时使用下面的双横线的表示法,能表示与上述一样的意思。

7.5.3 复杂的属性

E-R图表示复合属性的方法:

  • 复合属性name和address
  • 多值属性 { p h o n e _ n u m b e r } \{phone\_number\} {phone_number}
  • 派生属性 { a g e ( ) } \{age()\} {age()}

image-20211101140540390

7.5.4 角色

菱形和矩形上的连线上进行标注表示角色

e.g.course实体集合prereq联系集之间的角色标识course_id和prere_id

image-20211101141549224

7.5.5 非二元联系集

非二元联系集如下:

image-20211101142950061

在一个非二元的联系集外至多允许一个箭头。因为多余一个箭头可以用两种方式解释。

7.5.6 弱实体集
1.强实体集与弱实体集

考虑实体section,在section和course之间建立一个联系集sec_course。sec_course中的信息是冗余的,由于section中已经有了属性course_id,它标识开课所关联的课程。消除冗余的方式:

  • 一是删除联系sec_course。但是这样使二者的联系蕴含在一个属性中,这不是我们想要的。
  • 二是在section中不保存属性course_id,只保留剩下的sec_id,year以及semester。这样会使实体集没有足够的属性标识一个指定的section实体。
  • 三是下面要说的弱实体。将联系sec_course视为一个特殊的联系,给唯一的标识section提供course_id信息。

image-20211106150644594

弱实体集:没有足够属性以形成主码的实体集称为弱实体集。

强实体集:有主码的实体集称为强实体集。

2.属主实体集

弱实体集必须与一个称作标识(identifying)或属主实体集的实体集关联才有意义。

  • 弱实体集存在依赖于属主实体集
  • 属主实体集拥有他所标识的弱实体集
3.标识性联系

标识性联系是从弱实体集到标识(属主)实体集多对一的。

弱实体集在标识性联系中的参与是全部的。

标识性联系集不应该有任何一个描述属性。

以section为例:

  • section是弱实集
  • 其标识实体集是course
  • 标识性联系是sec_course
4.弱实体集的区分

弱实体集没有主码。弱实体集的分辨符是区分实体的属性集合。

在section中,分辨符为:

  • sec_id
  • year
  • semester
5.包含弱实体集的E-R图

包含弱实体集的E-R图有下面几个特性:

  • 弱实体集的分辨符用虚下划线标识,而不是实现
  • 关联弱实体集和标识性强实体集的联系集用双菱形标识
  • 双线:弱实体集必须全部参与

image-20211101221105271

6.弱实体集的多个联系集

弱实体集可以与参与标识性联系以外的其他联系。

弱实体集可以作为属主。与另一个弱实体集参与一个标识性联系。

一个弱实体集也可能与不止一个标识性实体集有联系。

7.5.7 大学的E-R图

image-20211106100143913

7.6 转换为关系模式

数据库设计中,每个实体集和每个联系集都有唯一的关系模式与之对应。

【关系模式名】====对应【实体集名】或对应【联系集名】
转 换 为 关 系 模 式 { 关 系 模 式 表 示 E − R 关 系 E − R 中 的 约 束 映 射 到 关 系 模 式 上 的 约 束 转换为关系模式\begin{cases}关系模式表示E-R关系\\E-R中的约束映射到关系模式上的约束\end{cases} {ERER

7.6.1 具有简单属性的强实体集的表示
1.简单属性

简单属性:简单属性 a 1 , a 2 , . . . , a n a_1,a_2,...,a_n a1,a2,...,an表示的强实体集,那么用具有n个不同属性的模式E来表示这个实体集。

2.主码

主码:强实体集的主码就是生成的模式的主码

e.g. student实体集。有三个属性ID,name和tot_cred。用名为student的关系模式表示这个实体集,有三个属性:

student( ID, name, tot_credit)
7.6.2 具有复杂属性的强实体集的表示
1.复合属性

复合属性:复合属性本身不做属性,子属性作为属性,如first_name和middle_name替代name。address也不出现,使用street_number,street_name以及apt_number替代。
n a m e → { f i r s t _ n a m e m i d d l e _ n a m e a d d r e s s → { s t r e e t _ n u m b e r s t r e e t _ n a m e a p t _ n u m b e r name\rightarrow\begin{cases}first\_name\\middle\_name\\\end{cases}\\ address\rightarrow\begin{cases}street\_number\\street\_name\\apt\_number\\\end{cases} name{first_namemiddle_nameaddressstreet_numberstreet_nameapt_number

2.多值属性

多值属性:多值属性创建新的关系模式。注意外码参照关系。

特别的,当一个实体集只有一个主码B和一个多值属性M时——该实体集的关系模式只包含一个主码B,那么删除这个关系,同时保留具有属性B和对应M的属性A的关系模式。

3.派生属性

派生属性:不表示,其他数据模型中表示为方法。

7.6.3 弱实体集的表示

设A是具有属性 a 1 , a 2 , . . . , a m a_1,a_2,...,a_m a1,a2,...,am的弱实体集,设B是A所依赖的强实体集。设B的主码包括属性 b 1 , b 2 , . . . , b n b_1,b_2,...,b_n b1,b2,...,bn
用名为A的关系模式表示实体集A,该模式的每个属性对应一下集合中的一个成员:
{ a 1 , a 2 , . . . , a m } ⋃ { b 1 , b 2 , . . . , b m } \{a_1,a_2,...,a_m\}\bigcup\{b_1,b_2,...,b_m\} {a1,a2,...,am}{b1,b2,...,bm}

1.主码

主码:主码依赖于其所依赖的强实体集的主码以及弱实体集的分辨符

2.外码

外码:说明属性 b 1 , . . . , b n b_1,...,b_n b1,...,bn参照关系模式B的主码。

外码约束表示每个弱实体都有一个表示相应强实体的元组与之对应。

e.g. 弱实体集section为例,转换为关系模式:

section( course_id, sec_id, semester, year)

主码由course的主码和section的分辩符组成。模式上需要建立course_id参照course模式的主码的外码约束,以及完整性约束级联删除。

7.6.4 联系集的表示
1.属性

设R是联系集,设 a 1 , a 2 , . . . , a m a_1,a_2,...,a_m a1,a2,...,am表示所有参与R的实体集的主码的并集构成的属性集合。设R的描述性属性(if there be)有 b 1 , b 2 , . . . , b n b_1,b_2,...,b_n b1,b2,...,bn我们用名为R的关系模式表示该联系集,下面集合中的每一项表示模式一个属性:
{ a 1 , a 2 , . . . , a m } ⋃ { b 1 , b 2 , . . . , b n } \{a_1,a_2,...,a_m\}\bigcup\{b_1,b_2,...,b_n\} {a1,a2,...,am}{b1,b2,...,bn}

2.主码

7.3.3中有描述。所有参与实体集的主码的并集为联系集的超码。而联系集的主码取决于映射基数

  • 多对多的二元联系集,主码属性的并集成为主码。
  • 一对一的二元联系集,任意一个实体集的主码都可以作为联系集的主码
  • 多对一的二元联系集,联系为“多”的那一方的主码作为联系集的主码
7.6.4.1 模式的冗余

连接强实体集和弱实体集的联系集比较特殊。这样的联系是多对一的,且没有描述性属性。且弱实体集的主码包含强实体集的主码。

这样的联系集的模式将会是冗余的。即:一般情况下,连接弱实体集和强实体集的联系集的模式时冗余的,而且在基于E-R图的关系数据库设计中不必给出。

7.6.4.2 模式的合并
1.多对一关系的合并

考虑从实体集A到实体集B的一个多对一的联系集AB。得到三个模式A,B,AB。进一步假设A正在联系中的参与是全部的:每个A中的实体必须参与到联系AB中。这样将A和模式AB合并成单个包含两个模式所有属性的并集的模式

image-20211106155239163
  • inst_dept。模式instructor和department分别对应A和B。因此instructor和inst_dept合并。结果是instructor的模式如下:

    {ID, name, dept_name, salary}

  • stud_dept。同上

2.一对一关系的合并

一对一联系的情况下,联系集的关系模式可以和参与联系的任何一个实体集的模式进行合并。如果参与是部分的,那么就用空值来进行模式的合并

另外注意联系集的外码约束在合并后仍要体现。

7.7 实体-联系设计问题

7.7.1 用实体集还是用属性
1.phone_number的例子

考虑在instructor中加入属性phone_number,那么有下面的两种的建模方式:

image-20211106162154118

这两种方式的主要差别在于我们希不希望保存有关电话的额外信息。

2.常见错误
  • 错误1:一个实体集的主码作为另一个实体集的属性,而不是用联系。不应该使二者的关系隐含在属性中。
  • 错误2:将实体集的主码属性作为联系集的属性。
7.7.2 用实体集还是联系集

才可用的一个原则是:当描述发生在实体间的行为时采用联系集。

7.7.3 二元还是n元联系集
1.二元联系的更好表达

image-20211106173252277

2.n元联系转换为二元联系

一个非二元的联系总可以用一组不同的二元联系替代。

image-20211106173523357
3.二元联系影响表达

联想pro_guide的例子

7.7.4 联系属性的布局
  • 一对一或者一对多联系的属性可以放在实体集中。

    例如advisor联系中成为导师的时间date,可以放在学生中作为属性。

  • 多对多的联系集,属性必须作为联系集的属性

7.8 扩展的E-R特性

定义具有属性ID,name以及address的实体集person来建模

7.8.1 特化

实体集中包含子集,子集中的实体在某些方面区别于实体集中的其他的实体。

比如实体集person可以进一步归类为以下的两类之一:

  • employee
  • student

两类中的每一个都用一个属性集来描述,包括实体集person的所有属性加上可能的附加属性。比如:
e m p l o y e e 的 属 性 = p e r s o n 的 属 性 + 可 能 的 附 加 属 性 s a l a r y s t u d e n t 的 属 性 = p e r s o n 的 属 性 + 可 能 的 附 加 属 性 t o t _ c r e d i t s employee的属性 = person的属性+可能的附加属性salary\\ student的属性 = person的属性+可能的附加属性tot\_credits employee=person+salarystudent=person+tot_credits

7.9 数据建模的其他表示方法

实体是具体的对象:

image-20211030213842816

学生:实体,矩形框表示

属性:椭圆,实线

学号:下划线,实体标识符——唯一确定一个实体

姓名:组合属性,分为姓和名

年龄:派生属性,可由出生日期来确定

电话:双线——代表多值。一个人可以有多部电话。

实体可以是抽象的对象:

image-20211030214229024

作者:多值属性,第一作者,第二作者

ISBN:实体标识符

事件作为实体:

image-20211030214321103

一场足球赛是一个实体。

联系:多个实体之间的关联关系。

联系在E-R图中用菱形表示,

  • 表示隶属关系:

image-20211030214431169

  • 动态的,描述事件

    image-20211030214511174

    联系应该表达清楚参与者,联系中不应该有过多的无关的参与者。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Blanche117

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值