MySQL第四讲·如何正确设置主键?

news2024/11/27 22:34:46

在这里插入图片描述

你好,我是安然无虞。

文章目录

  • 主键:如何正确设置主键?
    • 业务字段做主键
    • 自增字段做主键
    • 手动赋值字段做主键
  • 主键总结

主键:如何正确设置主键?

前面我们在讲解存储的时候,有提到过主键,它可以唯一标识表中的某一条记录,对数据表来说非常重要。当我们需要查询和引用表中的一条数据记录的时候,最好的办法就是通过主键。只有合理地设置主键,才能确保我们准确、快速的找到所需要的数据记录。

下面我们借助超市项目的实际需求,来讲解一下怎么正确设置主键?

在超市项目中,店家想进行会员营销,相应的,我们就需要处理会员信息。

会员信息表(demo.membermaster)的设计大体如下:

img

为了能够唯一的标识一个会员的信息,我们需要为会员信息表设置一个主键,那么,怎么为这张表设置主键,才能达到我们理想的目标呢?

其实,设置主键一共有三种思路:业务字段做主键自增字段做主键手动赋值字段做主键

业务字段做主键

针对这个需求,我们最容易想到的是选择表中跟业务相关的字段做主键。

那么在这张表中,哪个字段比较合适呢?

会员卡号(cardno)看起来比较合适,因为会员卡号不能为空,而且有唯一性,可以用来标识一条会员记录,OK,那我们尝试一下:

我们在创建表的时候,设置字段cardno为主键:

create table demo.membermaster
(
cardno char(8) primary key, -- 会员卡号为主键
membername text,
memberphone text,
memberpid text,
memberaddress text,
sex text,
birthday datetime
);

会员卡号做主键有什么问题呢?我们插入2条数据来验证一下:

mysql> insert into demo.membermaster
-> (
-> cardno,
-> membername,
-> memberphone,
-> memberpid,
-> memberaddress,
-> sex,
-> birthday
-> )
-> values
-> (
-> '10000001',
-> '张三',
-> '13812345678',
-> '110123200001017890',
-> '北京',
-> '男',
-> '2000-01-01'
-> );
Query OK, 1 row affected (0.01 sec)
 
mysql> insert into demo.membermaster
-> (
-> cardno,
-> membername,
-> memberphone,
-> memberpid,
-> memberaddress,
-> sex,
-> birthday
-> )
-> values
-> (
-> '10000002',
-> '李四',
-> '13512345678',
-> '123123199001012356',
-> '上海',
-> '女',
-> '1990-01-01'
-> );
Query OK, 1 row affected (0.01 sec)

插入成功后,我们来看看表中的内容:

mysql> select *
    -> from demo.membermaster;
+----------+------------+-------------+--------------------+---------------+------+---------------------+
| cardno   | membername | memberphone | memberpid          | memberaddress | sex  | birthday            |
+----------+------------+-------------+--------------------+---------------+------+---------------------+
| 10000001 | 张三       | 13812345678 | 110123200001017890 | 北京          || 2000-01-01 00:00:00 |
| 10000002 | 李四       | 13512345678 | 123123199001012356 | 上海          || 1990-01-01 00:00:00 |
+----------+------------+-------------+--------------------+---------------+------+---------------------+
2 rows in set (0.00 sec)

可以看到,不同的会员卡号对应不同的会员,字段cardno唯一标识某一个会员。

如果都是这样的话,会员卡号与会员一一对应,系统是可以正常运行的。但是实际情况是,会员卡号是存在重复使用的情况的。这个很好理解,比如,张三因为工作变动搬离了原来的地址,不再到商家的门店消费了(退还了会员卡),于是张三就不再是这家商店的会员了,于是商家为了不让会员卡空着,就把卡号10000001的会员卡发给了王五。

从系统设计的角度看,这个变化只是修改了会员信息表的卡号10000001这个会员信息,并不会影响到数据的一致性。也就是说,修改会员卡号10000001的会员信息,系统的各个模块,都会获取到修改后的会员信息,不会出现“有的模块获取到修改之前的会员信息,有的模块获取到修改后的会员信息,而导致系统内部数据不一致”的情况。因此,从信息系统层面上看是没问题的。

但是从使用系统的业务层面来看,就有很大的问题了,会对商家造成影响。

比如,我们有一个销售流水表,记录了所有的销售流水明细。2020 年 12 月 01 日,张三在门店购买了一本书,消费了 89 元。那么,系统中就有了张三买书的流水记录,如下所示:

img

因为需要引用会员信息和商品信息,所以销售流水表需要包括商品编号字段和会员卡号字段:

create table demo.trans
(
transactionno int,
itemnumber int, -- 为了引用商品信息
quantity decimal(10,3), 
price decimal(10,2),
salesvalues decimal(10,2),
cardno char(8), -- 为了引用会员信息
transdate datetime
);

创建表之后,我们来插入一条销售流水:

mysql> insert into demo.trans
-> (
-> transactionno,
-> itemnumber,
-> quantity,
-> price,
-> salesvalue,
-> cardno,
-> transdate
-> )
-> values
-> (
-> 1,
-> 1,
-> 1,
-> 89,
-> 89,
-> '10000001',
-> '2020-12-01'
-> );
Query OK, 1 row affected (0.01 sec)

接着,我们来查询2020年12月01日的会员销售记录:

mysql> select b.membername,c.goodsname,a.quantity,a.salesvalue,a.transdate
-> from demo.trans as a
-> join demo.membermaster as b
-> join demo.goodsmaster as c
-> on (a.cardno = b.cardno and a.itemnumber=c.itemnumber);
+------------+-----------+----------+------------+---------------------+
| membername | goodsname | quantity | salesvalue | transdate |
+------------+-----------+----------+------------+---------------------+
| 张三 || 1.000 | 89.00 | 2020-12-01 00:00:00 |
+------------+-----------+----------+------------+---------------------+
1 row in set (0.00 sec)

我们得到的查询结果是:张三,在 2020 年 12 月 01 日买了一本书,花了 89 元。

需要注意的是,这里我用到了 JOIN,也就是表的关联,目的是为了引用其他表的信息,包括会员信息表(demo.membermaster)和商品信息表(demo.goodsmaster)。

有关关联表查询的具体细节,后面文章会讲到,这里我们只要知道,通过关联查询,可以从会员信息表中获取会员信息,从商品信息表中获取商品信息,就可以了。

下面,我们假设会员卡“10000001”又发给了王五,我们需要更改会员信息表:

mysql> update demo.membermaster
-> set membername = '王五',
-> memberphone = '13698765432',
-> memberpid = '475145197001012356',
-> memberaddress='天津',
-> sex='女',
-> birthday = '1970-01-01'
-> where cardno = '10000001';
Query OK, 1 row affected (0.02 sec)
Rows matched: 1 Changed: 1 Warnings: 0

会员记录改好了,我们再次运行之前的会员消费流水查询:

mysql> select b.membername,c.goodsname,a.quantity,a.salesvalue,a.transdate
-> from demo.trans as a
-> join demo.membermaster as b
-> join demo.goodsmaster as c
-> on (a.cardno = b.cardno and a.itemnumber=c.itemnumber);
+------------+-----------+----------+------------+---------------------+
| membername | goodsname | quantity | salesvalue | transdate |
+------------+-----------+----------+------------+---------------------+
| 王五 || 1.000 | 89.00 | 2020-12-01 00:00:00 |
+------------+-----------+----------+------------+---------------------+
1 row in set (0.01 sec)

这次得到的结果是:王五在 2020 年 12 月 01 日,买了一本书,消费 89 元。很明显,这个结果把张三的消费行为放到王五身上去了,肯定是不对的。

这里的原因就是,我们把会员卡号是“10000001”的会员信息改了,而会员卡号是主键,会员消费查询通过会员卡号关联到会员信息,得到了完全错误的结果。

所以,千万不能把会员卡号当做主键。那么,会员电话可以做主键吗?不行的。在实际操作中,手机号也存在被运营商收回,重新发给别人用的情况。那身份证号行不行呢?好像可以。因为身份证决不会重复,身份证号与一个人存在一一对应的关系。可问题是,身份证号属于个人隐私,顾客不一定愿意给你。对门店来说,顾客就是上帝,要是强制要求会员必须登记身份证号,会把很多客人赶跑的。其实,客户电话也有这个问题,这也是我们在设计会员信息表的时候,允许身份证号和电话都为空的原因。

这样看来,任何一个现有的字段都不适合做主键。

所以这里给出的建议是,尽量不要使用业务字段,也就是跟业务有关的字段做主键。

既然业务字段不可以,那么我们试试自增字段。

自增字段做主键

我们来给会员信息表添加一个字段,比如叫 id,给这个字段定义自增约束,这样,我们就有了一个具备唯一性的,而且不为空的字段来做主键了。

接下来,我们就来修改一下会员信息表的结构,添加一个自增字段做主键。

第一步,修改会员信息表,删除表的主键约束,这样一来,原先的主键字段,就不再是主键了。需要注意的是,删除主键约束,并不会删除字段。

mysql> alter table demo.membermaster
-> drop primary key;
Query OK, 2 rows affected (0.12 sec)
Records: 2 Duplicates: 0 Warnings: 0

第二步,修改会员信息表,添加字段‘id’为主键,并给它定义自增约束:

mysql> alter table demo.membermaster
-> add id int primary key auto_increment;
Query OK, 0 rows affected (0.12 sec)
Records: 0 Duplicates: 0 Warnings: 0

第三步,修改销售流水表,添加新的字段menberid,对应会员信息表中的主键:

mysql> alter table demo.trans
-> add memberid int;
Query OK, 0 rows affected (0.04 sec)
Records: 0 Duplicates: 0 Warnings: 0

第四步,我们更新一下销售流水表,给新添加的字段memberid赋值,让它指向对应的会员信息;

mysql> update demo.trans as a, demo.membermaster as b
-> set a.memberid = b.id
-> where a.transactionno > 0 and a.cardno = b.cardno; -- 这样操作可以不用删除trans的内容,在实际工作中更适合
Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0

这个更新语句包含了 2 个关联的表,看上去有点复杂。虽然复杂一些,但是在实战中更有用。

OK,到这里我们就完成了对数据表的重新设计,让我们来看一下新的数据表demo.membermaster和demo.trans的结构:

mysql> desc demo.membermaster;
+---------------+----------+------+-----+---------+----------------+
| Field         | Type     | Null | Key | Default | Extra          |
+---------------+----------+------+-----+---------+----------------+
| cardno        | char(8)  | NO   |     | NULL    |                |
| membername    | text     | YES  |     | NULL    |                |
| memberphone   | text     | YES  |     | NULL    |                |
| memberpid     | text     | YES  |     | NULL    |                |
| memberaddress | text     | YES  |     | NULL    |                |
| sex           | text     | YES  |     | NULL    |                |
| birthday      | datetime | YES  |     | NULL    |                |
| id            | int      | NO   | PRI | NULL    | auto_increment |
+---------------+----------+------+-----+---------+----------------+
8 rows in set (0.02 sec)

mysql> desc demo.trans;
+---------------+---------------+------+-----+---------+-------+
| Field         | Type          | Null | Key | Default | Extra |
+---------------+---------------+------+-----+---------+-------+
| transactionno | int           | NO   | PRI | NULL    |       |
| itemnumber    | int           | YES  |     | NULL    |       |
| quantity      | decimal(10,3) | YES  |     | NULL    |       |
| price         | decimal(10,2) | YES  |     | NULL    |       |
| salesvalue    | decimal(10,2) | YES  |     | NULL    |       |
| cardno        | char(8)       | YES  |     | NULL    |       |
| transdate     | datetime      | YES  |     | NULL    |       |
| memberid      | int           | YES  |     | NULL    |       |
+---------------+---------------+------+-----+---------+-------+
8 rows in set (0.00 sec)

现在,如果我们再次面对卡号重用的情况,该如何应对呢(这里我们假设回到修改会员卡 10000001 为王五之前的状态)?

如果张三的会员卡“10000001”不再使用,发给了王五,我们就在会员信息表里面增加一条记录:

mysql> insert into demo.membermaster
-> (
-> cardno,
-> membername,
-> memberphone,
-> memberpid,
-> memberaddress,
-> sex,
-> birthday
-> )
-> values
-> (
-> '10000001',
-> '王五',
-> '13698765432',
-> '475145197001012356',
-> '天津',
-> '女',
-> '1970-01-01'
-> );
Query OK, 1 row affected (0.02 sec)

我们看看当前的会员信息:

mysql> select *
    -> from demo.membermaster;
+----------+------------+-------------+--------------------+---------------+------+---------------------+----+
| cardno   | membername | memberphone | memberpid          | memberaddress | sex  | birthday            | id |
+----------+------------+-------------+--------------------+---------------+------+---------------------+----+
| 10000001 | 张三       | 13812345678 | 110123200001017890 | 北京          || 2000-01-01 00:00:00 |  1 |
| 10000002 | 李四       | 13512345678 | 123123199001012356 | 上海          || 1990-01-01 00:00:00 |  2 |
| 10000001 | 王五       | 13698765432 | 475145197001012356 | 天津          || 1970-01-01 00:00:00 |  3 |
+----------+------------+-------------+--------------------+---------------+------+---------------------+----+
3 rows in set (0.00 sec)

由于字段“cardno”不再是主键,可以允许重复,因此,我们可以在保留会员“张三”信息的同时,添加使用同一会员卡号的“王五”的信息。

现在再来查会员消费,就不会出问题了:

mysql> select b.membername,c.goodsname,a.quantity,a.salesvalue,a.transdate
-> from demo.trans as a
-> join demo.membermaster as b
-> join demo.goodsmaster as c
-> on (a.memberid = b.id and a.itemnumber=c.itemnumber);
+------------+-----------+----------+------------+---------------------+
| membername | goodsname | quantity | salesvalue | transdate |
+------------+-----------+----------+------------+---------------------+
| 张三 || 1.000 | 89.00 | 2020-12-01 00:00:00 |
+------------+-----------+----------+------------+---------------------+
1 row in set (0.01 sec)

可以看到,结果是 2020 年 12 月 01 日,张三买了一本书,消费 89 元,是正确的。

如果是一个小项目,只有一个 MySQL 数据库服务器,用添加自增字段作为主键的办法是可以的。不过,这并不意味着,在任何情况下你都可以这么做。

举个例子,用户要求把增加新会员的工作放到门店进行,因为发展新会员的工作一般是在门店进行的,毕竟,人们一般都是在购物的同时申请会员。解决的办法是,门店的信息系统添加新增会员的功能,把新的会员信息先存放到本地 MySQL 数据库中,再上传到总部,进行汇总。

可是问题来了,如果会员信息表的主键是自增的,那么各个门店新加的会员就会出现“id”冲突的可能。

比如,A 店的 MySQL 数据库中的 demo.membermaster 中,字段“id”的值是 100,这个时候,新增了一个会员,“id”是 101。同时,B 店的字段“id”值也是 100,要加一个新会员,“id”也是 101,毕竟,B 店的 MySQL 数据库与 A 店相互独立。等 A 店与 B 店都把新的会员上传到总部之后,就会出现两个“id”是 101,但却是不同会员的情况,这该如何处理呢?

手动赋值字段做主键

为了解决这个问题,我们想了一个办法:取消字段“id”的自增属性,改成信息系统在添加会员的时候对“id”进行赋值。

具体的操作是这样的:在总部 MySQL 数据库中,有一个管理信息表,里面的信息包括成本核算策略,支付方式等,还有总部的系统参数,我们可以在这个表中添加一个字段,专门用来记录当前会员编号的最大值。

门店在添加会员的时候,先到总部 MySQL 数据库中获取这个最大值,在这个基础上加 1,然后用这个值作为新会员的“id”,同时,更新总部 MySQL 数据库管理信息表中的当前会员编号的最大值。

这样一来,各个门店添加会员的时候,都对同一个总部 MySQL 数据库中的数据表字段进行操作,就解决了各门店添加会员时会员编号冲突的问题,同时也避免了使用业务字段导致数据错误的问题。

主键总结

设置数据表主键的三种方式:数据表的业务字段做主键、添加自增字段做主键,以及添加手动赋值字段做主键。

  • 用业务字段做主键,看起来很简单,但是我们应该尽量避免这样做。因为我们无法预测未来会不会因为业务需要,而出现业务字段重复或者重用的情况。
  • 自增字段做主键,对于单机系统来说是没问题的。但是,如果有多台服务器,各自都可以录入数据,那就不一定适用了。因为如果每台机器各自产生的数据需要合并,就可能会出现主键重复的问题。
  • 我们可以采用手动赋值的办法,通过一定的逻辑,确保字段值在全系统的唯一性,这样就可以规避主键重复的问题了。

刚开始使用 MySQL 时,很多人都很容易犯的错误是喜欢用业务字段做主键,想当然地认为了解业务需求,但实际情况往往出乎意料,而更改主键设置的成本非常高。所以,如果你的系统比较复杂,尽量给表加一个字段做主键,采用手动赋值的办法,虽然系统开发的时候麻烦一点,却可以避免后面出大问题。

文章参考:朱晓峰·MySQL必知必会

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1172754.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CrossOver软件2024最新版本下载

我们都明白快速运行:无须再独立运行一个Win电脑操作系统,进而解决双启动的繁杂和vm虚拟机的卡屏。习惯上来说极速运行:CrossOver能够让Win软件全速全状态运行,不会有丝毫的性能影响,让你在MAC系统中使用熟悉的Win应用。…

【JMeter】后置处理器的分类以及场景介绍

1.常用后置处理器的分类 Json提取器 针对响应体的返回结果是json格式的会自动生成新的变量名为【提取器中变量名_MatchNr】,取到的个数由jsonpath expression取到的个数决定 可以当作普通变量调用,调用语法:${提取器中变量名_MatchNr}正则表达式提取器 返回结果是任何数据格…

2022年12月 Python(三级)真题解析#中国电子学会#全国青少年软件编程等级考试

Python等级考试(1~6级)全部真题・点这里 一、单选题(共25题,每题2分,共50分) 第1题 列表L1中全是整数,小明想将其中所有奇数都增加1,偶数不变,于是编写了如下图所示的代…

单链表经典算法

移除链表元素 给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val val 的节点,并返回 新的头节点 。 思路:(1)创建三个结构体指针,分别代表一条新链表的头newhead,…

Day20力扣打卡

打卡记录 数组中两个数的最大异或值&#xff08;位运算&#xff09; 链接 二进制位上从高位向低位进行模拟&#xff0c;看数组中是否有满足此情况的数字。具体题解 class Solution { public:int findMaximumXOR(vector<int>& nums) {int mx *max_element(nums.be…

c语言经典算法—二分查找,冒泡,选择,插入,归并,快排,堆排

一、二分查找 1、前提条件&#xff1a;数据有序&#xff0c;随机访问&#xff1b; 2、实现&#xff1a;递归实现&#xff0c;非递归实现 3、注意事项&#xff1a; 循环退出条件:low <high,low high.说明还有一个元素&#xff0c;该元素还要与key进行比较 mid的取值&#xf…

半导体工厂将应用哪些制造创新技术?

半导体工厂是高科技产业的结晶&#xff0c;汇聚了世界上最新的技术。 在半导体的原料硅晶片上绘制设计图纸&#xff0c;不产生误差&#xff0c;准确切割并包装&#xff0c;然后用芯片生产出我们使用的电脑、智能手机、手表等各种电子产品。绝大多数半导体厂都采用一贯的工艺&a…

vr煤矿掘进机事故模拟救援减少实际工作中的失误-深圳华锐视点

在矿业行业中&#xff0c;VR掘进机操作模拟仿真训练正逐渐成为一种高效、安全、便捷的培训方式。VR掘进机操作模拟仿真训练根据现实中掘进机操作情景进行流程模拟还原&#xff0c;用户可以在沉浸模式下进行体验掘进机发生过程&#xff0c;加上模拟训练和实操考核&#xff0c;进…

MySQL数据脱敏(Data masking plugin functions)

对于企业而言&#xff0c;数据脱敏可以在数据共享或测试时用于保护敏感数据&#xff08;如信用卡&#xff0c;社保卡&#xff0c;地址等&#xff09;。通过对敏感数据进行脱敏处理&#xff0c;组织可以最大限度地降低数据泄露和未经授权访问的风险&#xff0c;同时仍能够使用真…

【WSL/WSL 2-Redis】解决Windows无法安装WSL Ubuntu子系统与Redis安装

前言 在现代计算环境中&#xff0c;开发人员和技术爱好者通常需要在不同的操作系统之间切换&#xff0c;以便利用各种工具和应用程序。在这方面&#xff0c;Windows用户可能发现WSL&#xff08;Windows Subsystem for Linux&#xff09;是一个强大的工具&#xff0c;它允许他们…

NocoDB任意文件读取漏洞复现

简介 NocoDB是一个开源 Airtable 替代品&#xff0c;可以将 MySql、PostgreSql、Sql Server、Sqlite 和 MariaDb 等转换为智能电子表格。 (CVE-2023-35843) NocoDB 0.106.0版本及之前版本存在安全漏洞。攻击者利用该漏洞可以访问服务器上的任意文件。 漏洞复现 FOFA语法&…

dji mini4pro 图片拷贝到电脑速度

环境 win电脑 amd3600 m.2固态硬盘 dp快充数据线 直接主机使用dp线连接无人机 9成是raw格式图片 一小部分是视频和全景图 TF卡信息: 闪迪 128GB 129元 闪迪 128GB TF(MicroSD) 存储卡U3 C10 V30 A2 4K 至尊超极速移动版 "TF卡至尊超极速" 理论读取200MB/s …

Android可绘制资源概览(背景、图形等)

关于作者&#xff1a;CSDN内容合伙人、技术专家&#xff0c; 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 &#xff0c;擅长java后端、移动开发、商业变现、人工智能等&#xff0c;希望大家多多支持。 目录 一、导读二、概览三、drawable 分类3.1 Bitmap fileXML …

LiveNVR监控流媒体Onvif/RTSP常见问题-分配展示接入的通道没有云台控制按钮云台控制灰色无法操作怎么办?

LiveNVR常见问题-接入的通道没有云台控制按钮云台控制灰色无法操作怎么办&#xff1f; 1、云台控制灰色2、怎样才可以云台控制3、RTSP/HLS/FLV/RTMP拉流Onvif流媒体服务 1、云台控制灰色 LiveNVR在分屏页面播放的时候&#xff0c;发现有边的云台控制不可用。而我们需要云台控制…

【排序算法】 快速排序(快排)!超详细看这一篇就够了”保姆级教学“

&#x1f3a5; 屿小夏 &#xff1a; 个人主页 &#x1f525;个人专栏 &#xff1a; 算法—排序篇 &#x1f304; 莫道桑榆晚&#xff0c;为霞尚满天&#xff01; 文章目录 &#x1f4d1;前言&#x1f324;️快速排序的概念☁️快速排序的由来☁️快速排序的思想☁️快速排序的实…

在Python中添加Selenium Web Driver等待

本文将介绍在Python中在Selenium Web驱动程序中添加等待的示例。 Python Selenium Web 驱动程序等待 大多数 Web 应用程序都使用 AJAX 技术。 因此&#xff0c;网页上存在的不同元素需要不同的时间间隔才能完全上传&#xff0c;因为硒在网页上存在之前无法找到任何文本。 我们…

康耐视深度学习ViDi-Workspace菜单介绍与Workspace侧拉菜单

Workspace菜单介绍 New ------- 新建一个程序&#xff0c;点击后会呼出如下窗口&#xff0c;输入需要建立的程序的名字。然后点击OK按钮&#xff0c;就会建立一个新的程序。 Save --------- 保存当前的程序 Close -------- 关闭当前的程序 Delete ------ 删除当前的程序 Save …

数字媒体技术基础之:ICC 配置文件

ICC 配置文件&#xff08;也称为 ICC 色彩配置文件或 ICC 色彩描述文件&#xff09;是由国际色彩联盟&#xff08;International Color Consortium, ICC&#xff09;制定的一种标准文件格式&#xff0c;用于在不同的设备和软件之间保持颜色的一致性。 ICC 配置文件包含有关设备…

“凸函数”是什么?

凸函数&#xff08;英文&#xff1a;Convex function&#xff09;是指函数图形上&#xff0c;任意两点连成的线段&#xff0c;皆位于图形的上方&#xff0c;如单变数的二次函数和指数函数。二阶可导的一元函数为凸&#xff0c;当且仅当其定义域为凸集&#xff0c;且函数的二阶导…

1-Docker虚拟化平台技术概述及简介

1.虚拟化技术概述及简介 通俗的说,虚拟化就是把物理资源转变为逻辑上可以管理的资源,以打破物理结构间的壁垒,计算元件运行在虚拟的基础上而不是真实的基础上,可以扩大硬件的容量,简化软件的重新配置过程。允许一个平台同时运行多个操作系统,并且应用程序都可以在相互独…