为什么要用数据库管理系统?5个你不得不知道的理由

news2024/9/26 5:19:59

你是否曾经想过,为什么几乎所有的企业和组织都在使用数据库管理系统(DBMS)?为什么不直接使用文件系统来存储和管理数据呢?如果你有这样的疑问,那么这篇文章正是为你而写。在接下来的内容中,我们将深入探讨使用数据库管理系统的5个关键原因,这些原因将彻底改变你对数据管理的认知。
在这里插入图片描述

目录

    • 1. 数据独立性:解放你的数据
      • 1.1 物理数据独立性
      • 1.2 逻辑数据独立性
    • 2. 数据完整性:保证你的数据可靠性
      • 2.1 实体完整性
      • 2.2 参照完整性
      • 2.3 域完整性
      • 2.4 用户定义完整性
    • 3. 并发控制:多用户访问的秘密武器
      • 3.1 锁定机制
      • 3.2 多版本并发控制(MVCC)
      • 3.3 时间戳排序
      • 3.4 乐观并发控制
    • 4. 数据安全:保护你的数字资产
      • 4.1 身份认证
      • 4.2 访问控制
      • 4.3 数据加密
      • 4.4 审计跟踪
    • 5. 数据恢复:你的数据安全网
      • 5.1 事务日志
      • 5.2 定期备份
      • 5.3 时间点恢复
      • 5.4 复制和故障转移
    • 结语:为什么数据库管理系统是不可或缺的

1. 数据独立性:解放你的数据

想象一下,如果你的所有数据都直接存储在应用程序中,每次需要更改数据结构时,你都需要修改整个应用程序。这听起来就像是一场噩梦,不是吗?这就是为什么数据独立性如此重要。

数据库管理系统提供了两种类型的数据独立性:

  1. 物理数据独立性
  2. 逻辑数据独立性
    image.png

1.1 物理数据独立性

物理数据独立性允许你更改数据的物理存储方式,而无需修改应用程序。例如,你可以将数据从一个磁盘移动到另一个磁盘,或者更改存储格式,而应用程序不会受到任何影响。

以下是一个简单的例子,说明了物理数据独立性的重要性:

-- 假设我们有一个存储用户信息的表
CREATE TABLE users (
    id INT PRIMARY KEY,
    name VARCHAR(50),
    email VARCHAR(100)
);

-- 现在,我们想要将这个表移动到一个新的表空间
ALTER TABLE users MOVE TABLESPACE new_tablespace;

image.png

在这个例子中,我们将users表移动到了一个新的表空间。这是一个物理存储的变更,但是使用这个表的应用程序不需要做任何修改。

1.2 逻辑数据独立性

逻辑数据独立性允许你更改数据库的逻辑结构(如添加新的字段),而不影响已经存在的应用程序。

考虑以下场景:

-- 原始的用户表
CREATE TABLE users (
    id INT PRIMARY KEY,
    name VARCHAR(50),
    email VARCHAR(100)
);

-- 现在,我们想要添加一个新的字段来存储用户的电话号码
ALTER TABLE users ADD COLUMN phone VARCHAR(20);

image.png

在这个例子中,我们向users表添加了一个新的phone字段。已经存在的应用程序仍然可以继续使用这个表,而不需要任何修改。只有那些需要使用新字段的应用程序才需要更新。

数据独立性不仅简化了数据管理,还大大提高了系统的灵活性和可维护性。想象一下,如果每次数据结构变化都需要修改所有相关的应用程序,那将是多么令人头疼的事情!

2. 数据完整性:保证你的数据可靠性

数据完整性是确保数据准确性和一致性的关键。没有proper的数据完整性约束,你的数据库就像是一个没有保安的银行金库。数据库管理系统提供了多种机制来确保数据完整性:

  1. 实体完整性
  2. 参照完整性
  3. 域完整性
  4. 用户定义完整性
    image.png

2.1 实体完整性

实体完整性确保每个表都有一个唯一的标识符(主键),防止重复记录的出现。

CREATE TABLE products (
    product_id INT PRIMARY KEY,  -- 这就是实体完整性约束
    product_name VARCHAR(100),
    price DECIMAL(10, 2)
);

在这个例子中,product_id被定义为主键,确保每个产品都有一个唯一的标识符。
image.png

2.2 参照完整性

参照完整性确保表之间的关系保持一致。它防止孤立的记录出现在相关表中。

CREATE TABLE orders (
    order_id INT PRIMARY KEY,
    product_id INT,
    quantity INT,
    FOREIGN KEY (product_id) REFERENCES products(product_id)  -- 这是参照完整性约束
);

这个外键约束确保每个订单都引用了products表中存在的产品。
image.png

2.3 域完整性

域完整性确保每个列中的值都符合定义的类型和约束。

CREATE TABLE employees (
    employee_id INT PRIMARY KEY,
    name VARCHAR(50) NOT NULL,  -- NOT NULL 是一种域完整性约束
    age INT CHECK (age >= 18),  -- CHECK 约束也是域完整性的一部分
    email VARCHAR(100) UNIQUE   -- UNIQUE 约束确保每个邮箱地址都是唯一的
);

在这个例子中,我们定义了多种域完整性约束:

  • name不能为空
  • age必须大于或等于18
  • email必须是唯一的
    image.png

2.4 用户定义完整性

用户定义完整性允许你定义特定于业务的规则。

CREATE TABLE inventory (
    product_id INT PRIMARY KEY,
    quantity INT,
    CONSTRAINT check_quantity CHECK (quantity >= 0)  -- 这是用户定义的完整性约束
);

这个约束确保库存数量永远不会为负数,这是一个特定于业务的规则。

通过这些完整性约束,数据库管理系统能够在数据输入阶段就捕获错误,而不是等到数据被使用时才发现问题。这不仅提高了数据的质量,还节省了大量的时间和资源。
image.png

3. 并发控制:多用户访问的秘密武器

在现代的多用户环境中,并发控制是至关重要的。想象一下,如果多个用户同时访问和修改同一条数据会发生什么?没有proper的并发控制,数据很容易变得不一致,甚至可能丢失。

数据库管理系统通过实现各种并发控制机制来解决这个问题:

  1. 锁定机制
  2. 多版本并发控制(MVCC)
  3. 时间戳排序
  4. 乐观并发控制
    image.png

3.1 锁定机制

锁定是最常见的并发控制方法之一。它允许多个事务同时读取数据,但只允许一个事务在任何给定时间修改数据。

-- 事务1
BEGIN TRANSACTION;
SELECT * FROM accounts WHERE account_id = 1 FOR UPDATE;
-- 此时,account_id = 1 的行被锁定,其他事务无法修改这行数据
UPDATE accounts SET balance = balance - 100 WHERE account_id = 1;
COMMIT;

-- 事务2(同时进行)
BEGIN TRANSACTION;
SELECT * FROM accounts WHERE account_id = 1 FOR UPDATE;
-- 这个事务会被阻塞,直到事务1完成并释放锁
UPDATE accounts SET balance = balance + 50 WHERE account_id = 1;
COMMIT;

image.png

在这个例子中,FOR UPDATE子句用于获取排他锁,确保在更新操作期间没有其他事务可以修改相同的数据。

3.2 多版本并发控制(MVCC)

MVCC是一种更高级的并发控制方法,它通过维护数据的多个版本来提高并发性。

-- 假设我们有一个商品表
CREATE TABLE products (
    id INT PRIMARY KEY,
    name VARCHAR(100),
    price DECIMAL(10, 2),
    version INT
);

-- 事务1
BEGIN TRANSACTION;
SELECT * FROM products WHERE id = 1 AND version = 1;
-- 假设查询结果为: (1, 'Product A', 100.00, 1)
UPDATE products SET price = 110.00, version = version + 1 WHERE id = 1 AND version = 1;
COMMIT;

-- 事务2(同时进行)
BEGIN TRANSACTION;
SELECT * FROM products WHERE id = 1 AND version = 1;
-- 假设查询结果为: (1, 'Product A', 100.00, 1)
UPDATE products SET price = 105.00, version = version + 1 WHERE id = 1 AND version = 1;
-- 这个更新会失败,因为版本号已经被事务1更新了
COMMIT;

在这个例子中,我们使用了一个version字段来实现MVCC。当两个事务试图同时更新同一条记录时,只有一个事务能成功,另一个事务会因为版本号不匹配而失败。这种方法避免了锁定,提高了系统的并发性。
image.png

3.3 时间戳排序

时间戳排序是另一种并发控制方法,它为每个事务分配一个唯一的时间戳,并使用这些时间戳来决定操作的执行顺序。

-- 假设我们有一个带有时间戳的账户表
CREATE TABLE accounts (
    id INT PRIMARY KEY,
    balance DECIMAL(10, 2),
    last_updated TIMESTAMP
);

-- 事务1
BEGIN TRANSACTION;
UPDATE accounts 
SET balance = balance - 100, last_updated = CURRENT_TIMESTAMP
WHERE id = 1 AND last_updated < CURRENT_TIMESTAMP;
COMMIT;

-- 事务2(同时进行)
BEGIN TRANSACTION;
UPDATE accounts 
SET balance = balance + 50, last_updated = CURRENT_TIMESTAMP
WHERE id = 1 AND last_updated < CURRENT_TIMESTAMP;
COMMIT;

在这个例子中,只有时间戳较新的事务能成功更新账户余额。这确保了更新操作的顺序性,防止了并发冲突。

3.4 乐观并发控制

乐观并发控制假设冲突是罕见的,允许事务自由进行,但在提交时检查是否有冲突。

-- 假设我们有一个商品表
CREATE TABLE products (
    id INT PRIMARY KEY,
    name VARCHAR(100),
    price DECIMAL(10, 2),
    last_updated TIMESTAMP
);

-- 事务1
BEGIN TRANSACTION;
SELECT * FROM products WHERE id = 1;
-- 假设查询结果为: (1, 'Product A', 100.00, '2023-01-01 10:00:00')
-- 应用程序进行一些计算...
UPDATE products 
SET price = 110.00, last_updated = CURRENT_TIMESTAMP
WHERE id = 1 AND last_updated = '2023-01-01 10:00:00';
-- 如果另一个事务已经更新了这条记录,这个更新会失败
COMMIT;

在这个例子中,我们在更新操作中检查last_updated时间戳。如果这个时间戳与事务开始时读取的值不同,说明有其他事务修改了这条记录,当前事务就会失败。

这些并发控制机制使得数据库管理系统能够处理复杂的多用户场景,确保数据的一致性和正确性。想象一下,如果你需要自己实现这些机制,那将是多么复杂和容易出错的工作!

4. 数据安全:保护你的数字资产

image.png

在当今的数字世界中,数据安全比以往任何时候都更加重要。数据库管理系统提供了多层次的安全机制来保护你的宝贵数据:

  1. 身份认证
  2. 访问控制
  3. 数据加密
  4. 审计跟踪
    image.png

4.1 身份认证

身份认证是确保只有授权用户才能访问数据库的第一道防线。

-- 创建一个新用户
CREATE USER 'john_doe'@'localhost' IDENTIFIED BY 'very_secure_password';

-- 登录
mysql -u john_doe -p
Enter password: very_secure_password

这个例子展示了如何创建一个新的数据库用户并使用密码进行身份认证。现代的数据库管理系统通常支持更高级的认证方法,如双因素认证或集成with企业级身份管理系统。

4.2 访问控制

一旦用户通过身份认证,访问控制决定了他们可以执行哪些操作。数据库管理系统通常提供细粒度的权限控制。

-- 授予john_doe用户对customers表的SELECT权限
GRANT SELECT ON database_name.customers TO 'john_doe'@'localhost';

-- 授予john_doe用户对orders表的INSERT和UPDATE权限
GRANT INSERT, UPDATE ON database_name.orders TO 'john_doe'@'localhost';

-- 撤销john_doe用户对customers表的SELECT权限
REVOKE SELECT ON database_name.customers FROM 'john_doe'@'localhost';

这些命令展示了如何精确控制用户对特定表的访问权限。你可以授予或撤销SELECT、INSERT、UPDATE、DELETE等权限,甚至可以控制对特定列的访问。

4.3 数据加密

加密是保护敏感数据的关键。现代数据库管理系统提供了多种加密选项:

  1. 传输加密(TLS/SSL)
  2. 静态数据加密
  3. 列级加密

以下是一个使用MySQL的列级加密例子:

-- 创建一个加密函数
CREATE FUNCTION encrypt_func (p_plaintext VARCHAR(255), p_key VARCHAR(32))
RETURNS VARBINARY(255)
RETURN AES_ENCRYPT(p_plaintext, p_key);

-- 创建一个解密函数
CREATE FUNCTION decrypt_func (p_ciphertext VARBINARY(255), p_key VARCHAR(32))
RETURNS VARCHAR(255)
RETURN AES_DECRYPT(p_ciphertext, p_key);

-- 创建一个带有加密列的表
CREATE TABLE sensitive_data (
    id INT PRIMARY KEY,好的,让我们继续探讨数据安全这个重要话题:

    name VARCHAR(100),
    credit_card VARBINARY(255)  -- 用于存储加密后的信用卡号
);

-- 插入加密数据
INSERT INTO sensitive_data (id, name, credit_card)
VALUES (1, 'John Doe', encrypt_func('1234-5678-9012-3456', 'my_secret_key'));

-- 查询并解密数据
SELECT id, name, decrypt_func(credit_card, 'my_secret_key') AS decrypted_cc
FROM sensitive_data;

在这个例子中,我们创建了自定义的加密和解密函数,并使用它们来保护敏感的信用卡信息。这种方法确保即使数据库被攻破,攻击者也无法直接读取敏感信息。

4.4 审计跟踪

审计跟踪允许数据库管理员监控和记录数据库活动,这对于安全和合规性都至关重要。

-- 启用MySQL审计插件
INSTALL PLUGIN audit_log SONAME 'audit_log.so';

-- 配置审计日志
SET GLOBAL audit_log_file = '/var/log/mysql/audit.log';
SET GLOBAL audit_log_policy = 'ALL';

-- 查看审计日志(在服务器上执行)
tail -f /var/log/mysql/audit.log

审计日志可以记录各种数据库活动,包括:

  • 登录尝试(成功和失败)
  • 执行的SQL语句
  • 数据修改操作
  • 权限变更

通过分析这些日志,你可以:

  1. 检测异常活动
  2. 跟踪数据变更
  3. 调查安全事件
  4. 满足合规要求(如GDPR, HIPAA等)

数据库管理系统的这些安全特性为你的数据提供了全方位的保护。想象一下,如果你需要从头开始实现所有这些安全措施,那将是多么困难和耗时的任务!使用DBMS,你可以专注于业务逻辑,而将复杂的安全问题交给专业的系统来处理。

5. 数据恢复:你的数据安全网

数据是现代企业的生命线。丢失关键数据可能导致巨大的财务损失,甚至威胁到企业的生存。这就是为什么数据恢复能力如此重要。数据库管理系统提供了强大的数据恢复机制,包括:

  1. 事务日志
  2. 定期备份
  3. 时间点恢复
  4. 复制和故障转移

5.1 事务日志

事务日志记录了数据库的所有变更,允许你在系统崩溃后恢复到一致的状态。

-- 启用事务日志(MySQL InnoDB引擎默认启用)
SET GLOBAL innodb_log_file_size = 50331648;  -- 设置日志文件大小为48MB
SET GLOBAL innodb_log_files_in_group = 2;    -- 使用2个日志文件

-- 模拟一个事务
START TRANSACTION;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
UPDATE accounts SET balance = balance + 100 WHERE id = 2;
-- 系统在此时崩溃

-- 重启后,数据库会自动使用事务日志恢复到一致状态

在这个例子中,即使系统在事务中途崩溃,事务日志也能确保数据库恢复到一致的状态。这种机制防止了部分更新导致的数据不一致问题。

5.2 定期备份

定期备份是防止数据丢失的基本策略。大多数数据库管理系统提供了内置的备份工具。

# 使用mysqldump进行完整备份
mysqldump -u root -p --all-databases > full_backup_$(date +%Y%m%d).sql

# 恢复备份
mysql -u root -p < full_backup_20230101.sql

这个例子展示了如何使用mysqldump工具创建一个完整的数据库备份,以及如何在需要时恢复这个备份。

5.3 时间点恢复

image.png

时间点恢复允许你将数据库恢复到过去的任意时间点。这在意外删除或损坏数据时特别有用。

-- 启用二进制日志(MySQL)
SET GLOBAL log_bin = ON;

-- 假设我们不小心删除了重要数据
DELETE FROM important_table;

-- 使用mysqlbinlog工具恢复到删除操作之前的状态
mysqlbinlog --stop-datetime="2023-01-01 12:00:00" /var/lib/mysql/mysql-bin.* | mysql -u root -p

在这个例子中,我们使用二进制日志来恢复数据。通过指定一个时间点,我们可以恢复到那个时刻之前的状态,有效地"撤销"之后的所有操作。

5.4 复制和故障转移

复制技术允许你维护数据库的多个副本,不仅提高了可用性,还为灾难恢复提供了基础。

-- 在主服务器上配置复制
CREATE USER 'repl'@'%' IDENTIFIED BY 'password';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';

-- 在从服务器上设置复制
CHANGE MASTER TO
  MASTER_HOST='master_host_name',
  MASTER_USER='repl',
  MASTER_PASSWORD='password',
  MASTER_LOG_FILE='mysql-bin.000001',
  MASTER_LOG_POS=0;

START SLAVE;

这个例子展示了如何设置MySQL的主从复制。在主服务器发生故障时,你可以快速切换到从服务器,minimizing停机时间。

数据库管理系统的这些数据恢复特性为你的数据提供了多层保护。它们不仅能帮助你从各种故障中恢复,还能minimizing数据丢失的风险。想象一下,如果没有这些工具,你将如何处理系统崩溃、人为错误或硬件故障带来的数据丢失风险?

结语:为什么数据库管理系统是不可或缺的

通过深入探讨这5个关键原因,我们可以清楚地看到为什么数据库管理系统在现代数据管理中扮演着如此重要的角色:

  1. 数据独立性让你能够灵活地改变数据的物理和逻辑结构,而不影响现有的应用程序。这大大提高了系统的可维护性和scalability。

  2. 数据完整性确保你的数据始终保持准确和一致。通过实体、参照、域和用户自定义完整性约束,DBMS帮助你在数据输入阶段就捕获错误,提高数据质量。

  3. 并发控制使得多用户环境下的数据访问变得安全和高效。无论是通过锁定、MVCC还是其他机制,DBMS都能确保数据的一致性,同时maximizing系统的并发性能。

  4. 数据安全特性为你的宝贵数据资产提供了全方位的保护。从身份认证到访问控制,从数据加密到审计跟踪,DBMS提供了一整套工具来应对各种安全威胁。

  5. 数据恢复能力为你提供了强大的安全网。无论是系统崩溃、人为错误还是灾难性事件,DBMS的恢复机制都能帮助你minimizing数据丢失并快速恢复业务运营。

这些功能不仅提高了数据管理的效率和可靠性,还大大降低了开发和维护成本。想象一下,如果你需要自己实现所有这些功能,那将是多么巨大的工作量!使用数据库管理系统,你可以将精力集中在核心业务逻辑上,而将复杂的数据管理问题交给专业的系统来处理。

在当今数据驱动的世界中,高效、安全、可靠的数据管理比以往任何时候都更加重要。数据库管理系统不仅满足了这些需求,还为未来的发展提供了坚实的基础。随着大数据、人工智能和物联网等技术的兴起,数据库管理系统的重要性只会越来越高。

所以,下次当你考虑如何管理你的数据时,记住:数据库管理系统不仅仅是一个选择,它是现代数据管理的必要工具。它为你的数据提供了一个安全、高效、可靠的家,让你能够充分利用这些宝贵的数字资产,驱动你的业务走向成功。

选择合适的数据库管理系统,掌握其强大的功能,你将为你的组织打开一扇通向数据驱动未来的大门。在这个数据就是新石油的时代,DBMS就是你挖掘、提炼和利用这种宝贵资源的强大工具。拥抱它,利用它,让它成为你数字化转型旅程中的得力助手!

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

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

相关文章

【Kubernetes】pod状态与故障排查

一、Pod启动阶段&#xff08;相位 phase&#xff09; pod创建完之后&#xff0c;一直到持久运行起来&#xff0c;中间有很多步骤&#xff0c;也就有很多出错的可能&#xff0c;因此会有很多不同的状态。 Pod的启动过程如下&#xff1a; 0&#xff09;controller-manager管理的…

qt-06QStackeddialog堆栈窗体应用

QStackeddialog堆栈窗体应用 QStackeddialog.hQStackeddialog.cppmain.cpp运行图 QStackeddialog.h #ifndef QSTACKEDDIALOG_H #define QSTACKEDDIALOG_H#include <QDialog> #include <QListWidget> #include <QStackedWidget> #include <QLabel>clas…

2024年【上海市安全员B证】模拟考试及上海市安全员B证证考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 上海市安全员B证模拟考试参考答案及上海市安全员B证考试试题解析是安全生产模拟考试一点通题库老师及上海市安全员B证操作证已考过的学员汇总&#xff0c;相对有效帮助上海市安全员B证证考试学员顺利通过考试。 1、【…

PySide6||QPushButton的QSS样式

1、狗狗拜按钮 QQ202484-03338 (online-video-cutter.com) /* QPushButton的基本样式 */ QPushButton { background-image:url(:/xxx/第1帧.png); /* 设置背景图片 */ background-repeat: no-repeat; /* 不重复背景图片 */ background-position: center; /* 将背景图片居中…

PS网页版在线制作:云端设计让效率更上一层楼!

在当今的设计行业中&#xff0c;PS曾经被认为是不可替代的工具。然而&#xff0c;对于设计师&#xff0c;尤其是UI设计师来说&#xff0c;PS有点太复杂了。PS更新频率快&#xff0c;稳定性差&#xff0c;对计算机配置要求高。对于初学者来说&#xff0c;这显然是一个“负担”。…

简单Qt贪吃蛇项目

目录 先看效果 项目介绍 界面一&#xff1a;游戏大厅界面 界面二&#xff1a;关卡选择界面​编辑 界面三&#xff1a;游戏界面 游戏大厅页面 游戏关卡选择页面 游戏房间页面 封装贪吃蛇数据结构 初始化游戏房间界面 设置窗口大小、标题、图标等 蛇的移动 初始化贪…

TR3复现Tramsformer

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 前言 Transformer模型是深度学习中的一个革命性架构&#xff0c;自从在NLP领域引入以来&#xff0c;就因其高效处理序列数据的能力而迅速成为主流。本文将通过…

谷粒商城实战笔记-nginx问题记录

记录在使用nginx中遇到的问题。 文章目录 1&#xff0c;网关路由匹配不生效2&#xff0c;网关路由配置前后顺序导致的问题(非nginx问题)3&#xff0c;nginx.conf upstream配置缺少端口4&#xff0c;配置结尾少分号5&#xff0c; proxy_pass 后跟的服务器 URL 是否以 / 结尾5.1 …

C语言学习:汉诺塔问题

汉诺塔_百度百科 (baidu.com)https://baike.baidu.com/item/%E6%B1%89%E8%AF%BA%E5%A1%94/3468295 // // Created by zzh on 2024/8/6. ////汉诺塔问题#include<stdio.h>void move(char x, char y) {printf("%c --> %c \n", x, y); }int hanoi(int count, i…

2024新版软件测试八股文及答案解析

前言 前面看到了一些面试题&#xff0c;总感觉会用得到&#xff0c;但是看一遍又记不住&#xff0c;所以我把面试题都整合在一起&#xff0c;都是来自各路大佬的分享&#xff0c;为了方便以后自己需要的时候刷一刷&#xff0c;不用再到处找题&#xff0c;今天把自己整理的这些…

WEB渗透未授权访问篇-Redis

测试 redis-cli redis-cli -h 127.0.0.1 flunshall 192.168.0.110:6379>ping PONG 存在未授权访问 JS打内网 var cmd new XMLHttpRequest(); cmd.open("POST", "http://127.0.0.1:6379"); cmd.send(flushall\r\n); var c…

51单片机之LED篇(二)独立按键

一、独立按键的介绍 1.1 独立按键的基本原理 相当于一种电子开关&#xff0c;按下时开关接通&#xff0c;松开时开关断开。 开关功能&#xff1a;独立按键内部通常包含一个有弹性的金属片&#xff0c;当按键被按下时&#xff0c;金属片与触点接触&#xff0c;电路连通&#x…

鸿蒙AI功能开发【hiai引擎框架-语音识别】 基础语音服务

hiai引擎框架-语音识别 介绍 本示例展示了使用hiai引擎框架提供的语音识别能力。 本示例展示了对一段音频流转换成文字的能力展示。 需要使用hiai引擎框架文本转语音接口kit.CoreSpeechKit.d.ts. 效果预览 使用说明&#xff1a; 在手机的主屏幕&#xff0c;点击”asrDemo…

CMake基础教程二

常用 环境变量 SET(ENV{VAR} VALUE)**常用变量&#xff1a;**| 变量名 | 含义 | | ----------------------------- | ---------------------------------------------------------…

Bitwise 首席投资官:忽略短期的市场波动,关注加密货币的发展前景

原文标题&#xff1a;《The Crypto Market Sell-Off: What Happened and Where We Go From Here》撰文&#xff1a;Matt Hougan&#xff0c;Bitwise 首席投资官编译&#xff1a;Chris&#xff0c;Techub News 加密货币市场在周末经历了大幅下跌。从上周五下午 4 点到周一早上 7…

2024年下软考报名全流程+备考指南(八月最新版)

2024年下半年软考备考&#xff0c;一定要知道这几点&#xff01; 2024年下半年软考报名已迫在眉睫&#xff0c;不知不觉间&#xff0c;留给下半年考试小伙伴们的复习时间只有三个月。备考的小伙伴们准备好了吗&#xff1f;这些全程重点&#xff0c;请务必收藏保存&#xff0c;…

C/C++数字与字符串互相转换

前言&#xff1a; 在C/C程序中&#xff0c;会需要把数字与字符串做出互相转换的操作&#xff0c;用于实现程序想要的效果。下面将介绍多种方法实现数字与字符串互相转换。 字符串转为数字 一、利用ASCII 我们知道每个字符都有一个ASCII码&#xff0c;利用这一点可以将字符-0…

vue文件style标签变成黄色,media query is expected

效果如下图所示&#xff0c;红色波浪线&#xff0c;鼠标放上去提示 media query is expected 对比其他文件后发现是引入scss文件后后面少了分号&#xff0c;导致报错&#xff0c;加上分号&#xff0c;效果如下图&#xff0c;完美解决~

文件操作常用函数及makefile的使用

文件操作中常用函数 1. getpwuid 定义: struct passwd *getpwuid(uid_t uid);功能: 根据用户ID&#xff08;UID&#xff09;返回与之对应的passwd结构体指针&#xff0c;该结构体包含用户的详细信息。常用字段: pw_name: 用户名。pw_uid: 用户ID。pw_gid: 用户的组ID。pw_dir…

Qt实现类似淘宝商品看板的界面,带有循环翻页以及点击某页跳转的功能

效果如下&#xff1a; #ifndef ModelDashboardGroup_h__ #define ModelDashboardGroup_h__#include <QGridLayout> #include <QLabel> #include <QPushButton> #include <QWidget>#include <QLabel> #include <QWidget> #include <QMou…