5.3 表结构设计与数据完整性

欢迎来到我的博客,很高兴能够在这里和您见面!欢迎订阅相关专栏:
工💗重💗hao💗:野老杂谈
⭐️ 全网最全IT互联网公司面试宝典:收集整理全网各大IT互联网公司技术、项目、HR面试真题.
⭐️ AIGC时代的创新与未来:详细讲解AIGC的概念、核心技术、应用领域等内容。
⭐️ 全流程数据技术实战指南:全面讲解从数据采集到数据可视化的整个过程,掌握构建现代化数据平台和数据仓库的核心技术和方法。
⭐️ 构建全面的数据指标体系:通过深入的理论解析、详细的实操步骤和丰富的案例分析,为读者提供系统化的指导,帮助他们构建和应用数据指标体系,提升数据驱动的决策水平。
⭐️《遇见Python:初识、了解与热恋》 :涵盖了Python学习的基础知识、进阶技巧和实际应用案例,帮助读者从零开始逐步掌握Python的各个方面,并最终能够进行项目开发和解决实际问题。
⭐️《MySQL全面指南:从基础到精通》通过丰富的实例和实践经验分享,带领你从数据库的基本操作入手,逐步迈向复杂的应用场景,最终成为数据库领域的专家。

摘要

在数据库设计的世界里,表结构是建筑的框架,而数据完整性是确保建筑不倒塌的钢筋。表结构设计不仅仅是定义字段和数据类型,它还关乎数据如何被存储、检索和维护。而数据完整性则是确保这些数据始终准确、可靠和一致的关键。本文通过生动的案例和大量代码示例,深入探讨表结构设计的核心原则和数据完整性的维护策略,帮助你构建一个高效、稳健的数据库系统。

关键词: 表结构设计, 数据完整性, 数据库设计, 外键约束, 数据一致性


引言

想象一下,你是一位建筑设计师,负责设计一座摩天大楼。你不仅要考虑大楼的外观,还要确保每根柱子、每块地板都能承受未来可能的重压。数据库设计中的表结构设计就像是这座大楼的骨架,支撑着数据的存储与操作。而数据完整性,则是确保这些数据在各种压力下依然保持一致的关键。

在数据库的世界里,表结构设计不仅影响数据库的性能、扩展性和可维护性,还直接关系到数据的完整性与可靠性。本文将通过生动有趣的故事、丰富的代码示例和实际应用中的最佳实践,带你深入了解表结构设计的艺术,以及如何确保数据在存储和操作过程中保持一致。

表结构设计:构建数据的骨架

表结构设计的基本原则

1. 理解业务需求

设计表结构的第一步是充分理解业务需求。只有在清楚地了解数据的实际应用场景、操作流程和未来扩展需求后,你才能设计出适合的表结构。

**故事时间:**假设你是一家餐厅的数据库设计师,餐厅老板告诉你,他们想要一个系统来管理顾客的订单。你需要知道顾客的姓名、电话、每次订单的详细信息,以及订单的时间和金额。你会怎么设计表结构?

首先,你需要将业务需求转化为数据库表格。你可能会创建如下几个表:

CREATE TABLE 顾客 (顾客ID INT PRIMARY KEY AUTO_INCREMENT,姓名 VARCHAR(100),电话 VARCHAR(20)
);CREATE TABLE 订单 (订单ID INT PRIMARY KEY AUTO_INCREMENT,顾客ID INT,订单时间 DATETIME,总金额 DECIMAL(10, 2),FOREIGN KEY (顾客ID) REFERENCES 顾客(顾客ID)
);CREATE TABLE 订单明细 (明细ID INT PRIMARY KEY AUTO_INCREMENT,订单ID INT,产品名称 VARCHAR(100),数量 INT,单价 DECIMAL(10, 2),FOREIGN KEY (订单ID) REFERENCES 订单(订单ID)
);

在这个设计中,我们分别为顾客、订单和订单明细创建了表格,每个表都有其独立的职责。这种结构不仅清晰,而且容易扩展。

2. 使用合适的数据类型

为每个字段选择合适的数据类型是表结构设计中的关键。数据类型的选择影响到数据库的存储效率、查询性能以及数据的准确性。

**示例:**如果你在设计顾客表时,为“电话”字段选择了INT数据类型,这会导致问题。电话号码可能包含前导零、区号等,并且并不适合作为数值处理。相反,使用VARCHAR类型更合适。

CREATE TABLE 顾客 (顾客ID INT PRIMARY KEY AUTO_INCREMENT,姓名 VARCHAR(100),电话 VARCHAR(20) -- 使用VARCHAR而非INT
);
3. 考虑表与表之间的关系

在设计表结构时,理解表与表之间的关系至关重要。这通常通过外键(Foreign Key)来实现。外键不仅帮助我们表示表之间的关系,还在一定程度上维护了数据的完整性。

**示例:**在订单系统中,订单表与顾客表之间存在一对多的关系,一个顾客可以有多个订单,而每个订单只能属于一个顾客。因此,我们在订单表中添加了一个外键,来引用顾客表中的顾客ID。

CREATE TABLE 订单 (订单ID INT PRIMARY KEY AUTO_INCREMENT,顾客ID INT,订单时间 DATETIME,总金额 DECIMAL(10, 2),FOREIGN KEY (顾客ID) REFERENCES 顾客(顾客ID) -- 外键约束
);

正规化:减少数据冗余

1. 第一范式(1NF)

第一范式要求每个字段只存储一个值,避免重复数据。例如,一个顾客表中,不能在“电话”字段中存储多个电话号码,而是应该将每个电话号码分配到单独的记录中。

CREATE TABLE 顾客电话 (电话ID INT PRIMARY KEY AUTO_INCREMENT,顾客ID INT,电话 VARCHAR(20),FOREIGN KEY (顾客ID) REFERENCES 顾客(顾客ID)
);
2. 第二范式(2NF)

第二范式在满足第一范式的基础上,消除了部分依赖。即,非主键字段必须完全依赖于主键,而不是部分依赖。对于包含复合主键的表,所有字段都应与整个主键相关。

**示例:**在订单明细表中,假设我们有一个包含“订单ID”和“产品名称”的复合主键,所有其他字段如“数量”和“单价”都应依赖于这个复合主键。如果它们只依赖于“产品名称”,那我们就违反了第二范式。

CREATE TABLE 订单明细 (明细ID INT PRIMARY KEY AUTO_INCREMENT,订单ID INT,产品名称 VARCHAR(100),数量 INT,单价 DECIMAL(10, 2),FOREIGN KEY (订单ID) REFERENCES 订单(订单ID)
);
3. 第三范式(3NF)

第三范式要求消除传递依赖,即非主键字段不应依赖于其他非主键字段。例如,在订单表中,顾客的详细信息(如姓名和电话)不应直接存储,而应该通过顾客ID来引用顾客表中的信息。

CREATE TABLE 订单 (订单ID INT PRIMARY KEY AUTO_INCREMENT,顾客ID INT,订单时间 DATETIME,总金额 DECIMAL(10, 2),FOREIGN KEY (顾客ID) REFERENCES 顾客(顾客ID)
);

实际设计中的反规范化

虽然正规化减少了数据冗余,但有时为了提升查询性能,我们可能会在实际设计中使用反规范化。例如,在一些分析型系统中,可能会为了查询速度而冗余存储一些计算结果或汇总数据。

**示例:**假设我们需要频繁查询顾客的订单总数和总金额,可以在顾客表中添加两个字段来存储这些汇总数据,而不是每次查询都通过连接订单表来计算。

CREATE TABLE 顾客 (顾客ID INT PRIMARY KEY AUTO_INCREMENT,姓名 VARCHAR(100),电话 VARCHAR(20),订单总数 INT DEFAULT 0,订单总金额 DECIMAL(10, 2) DEFAULT 0.00
);

通过反规范化,我们可以显著提升查询性能,但需要注意在数据更新时保持这些冗余字段的一致性。

数据完整性:确保数据的准确性与一致性

数据完整性的类型

数据完整性可以分为几种类型,每种类型都在维护数据库数据的准确性和一致性中起着重要作用。

1. 实体完整性

实体完整性是指表中的每一行都应有一个唯一的标识符,即主键。主键约束确保表中的每条记录都是唯一的,防止重复记录的出现。

**示例:**在顾客表中,顾客ID作为主键,确保了每个顾客的唯一性。

CREATE TABLE 顾客 (顾客ID INT PRIMARY KEY AUTO_INCREMENT,姓名 VARCHAR(100),电话 VARCHAR(20)
);
2. 域完整性

域完整性指的是字段的值必须符合预定义的规则或范围。通过设置字段的数据类型、长度和约束(如NOT NULLCHECK等),我们可以确保数据的有效性。

**示例:**在订单表中,确保订单时间不能为空,总金额不能为负数。

CREATE TABLE 订单 (订单ID INT PRIMARY KEY AUTO_INCREMENT,顾客ID INT,订单时间 DATETIME NOT NULL,总金额 DECIMAL(10, 2) CHECK (总金额 >= 0),FOREIGN KEY (顾客ID) REFERENCES 顾客(顾客ID)
);
3. 参照完整性

参照完整性确保表与表之间的关系保持一致性。外

键(Foreign Key)是实现参照完整性的主要手段,它确保了关系表中的外键值必须存在于被引用表的主键或唯一键中。

**示例:**在订单明细表中,订单ID是外键,它必须在订单表中存在,这样可以保证每个订单明细都属于某个有效的订单。

CREATE TABLE 订单明细 (明细ID INT PRIMARY KEY AUTO_INCREMENT,订单ID INT,产品名称 VARCHAR(100),数量 INT,单价 DECIMAL(10, 2),FOREIGN KEY (订单ID) REFERENCES 订单(订单ID)
);
4. 用户定义完整性

用户定义完整性指的是特定于应用的业务规则,比如一个订单的总金额不能超过某个限额,或某个字段必须符合特定的格式(如电子邮件地址)。这些规则通常通过触发器、存储过程或者应用程序逻辑来实现。

**示例:**在订单表中,添加一个触发器,确保在插入或更新订单时,总金额不能超过10,000。

DELIMITER $$
CREATE TRIGGER 限制订单金额
BEFORE INSERT ON 订单
FOR EACH ROW
BEGINIF NEW.总金额 > 10000 THENSIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '订单总金额不能超过 10,000';END IF;
END $$
DELIMITER ;

数据完整性约束的实现

实现数据完整性,主要依赖于数据库系统中的各种约束(Constraints)。这些约束通过在表结构中定义规则,来确保数据的准确性和一致性。

1. 主键约束(PRIMARY KEY)

主键约束用于唯一标识表中的每一行。它不仅确保了记录的唯一性,还允许对记录进行快速索引和检索。

**示例:**在顾客表中,顾客ID被定义为主键。

CREATE TABLE 顾客 (顾客ID INT PRIMARY KEY AUTO_INCREMENT,姓名 VARCHAR(100),电话 VARCHAR(20)
);
2. 外键约束(FOREIGN KEY)

外键约束用于维护表与表之间的关系,并确保数据的一致性。外键必须引用另一张表的主键或唯一键。

**示例:**在订单表中,顾客ID是外键,引用顾客表的主键顾客ID。

CREATE TABLE 订单 (订单ID INT PRIMARY KEY AUTO_INCREMENT,顾客ID INT,订单时间 DATETIME NOT NULL,总金额 DECIMAL(10, 2) CHECK (总金额 >= 0),FOREIGN KEY (顾客ID) REFERENCES 顾客(顾客ID)
);
3. 唯一约束(UNIQUE)

唯一约束确保表中的某个字段或字段组合具有唯一值,防止重复数据的插入。

**示例:**在顾客表中,电话号码字段可以设置唯一约束,确保每个顾客的电话号码唯一。

CREATE TABLE 顾客 (顾客ID INT PRIMARY KEY AUTO_INCREMENT,姓名 VARCHAR(100),电话 VARCHAR(20) UNIQUE
);
4. 检查约束(CHECK)

检查约束用于确保字段的值符合特定条件,比如数值范围、字符串格式等。

**示例:**在订单表中,确保总金额为正数。

CREATE TABLE 订单 (订单ID INT PRIMARY KEY AUTO_INCREMENT,顾客ID INT,订单时间 DATETIME NOT NULL,总金额 DECIMAL(10, 2) CHECK (总金额 >= 0),FOREIGN KEY (顾客ID) REFERENCES 顾客(顾客ID)
);
5. 非空约束(NOT NULL)

非空约束确保字段必须包含值,不能留空。这对于关键字段尤为重要。

**示例:**在订单表中,订单时间字段设置为非空,确保每个订单都有时间记录。

CREATE TABLE 订单 (订单ID INT PRIMARY KEY AUTO_INCREMENT,顾客ID INT,订单时间 DATETIME NOT NULL,总金额 DECIMAL(10, 2) CHECK (总金额 >= 0),FOREIGN KEY (顾客ID) REFERENCES 顾客(顾客ID)
);

保持数据完整性的挑战

尽管数据库系统提供了多种工具来维护数据完整性,但在实际操作中,我们仍然可能面临一些挑战。

1. 数据冗余与一致性

当数据库结构设计不当,或者为了性能优化而进行反规范化时,数据冗余可能会导致数据一致性问题。为了确保数据一致性,我们必须在更新数据时同步更新所有相关记录。这可能导致维护的复杂性增加。

**示例:**假设订单表中直接存储了顾客的姓名和电话,若顾客信息变更,我们需要确保订单表中的所有相关记录都被正确更新。

UPDATE 订单
SET 顾客姓名 = '张三',顾客电话 = '12345678901'
WHERE 顾客ID = 1;
2. 并发控制

在多用户环境下,多个用户可能同时访问和修改相同的数据。这时,如果没有良好的并发控制机制,可能导致数据冲突和不一致性问题。

**示例:**在订单系统中,两个用户可能同时更新同一订单的状态。如果没有正确的锁机制或事务控制,最终结果可能导致数据被覆盖或丢失。

START TRANSACTION;
UPDATE 订单 SET 状态 = '已付款' WHERE 订单ID = 1001;
COMMIT;
3. 业务逻辑与数据库设计

复杂的业务逻辑可能需要在数据库层面实施一些特殊的约束和触发器,以确保数据的完整性。然而,这种设计可能会增加系统的复杂性,并在某些情况下影响性能。

**示例:**在一个电子商务系统中,可能需要确保每次订单的金额都在合理范围内(如不能为负数或超出某个上限),这就需要在数据库中设置检查约束或触发器。

DELIMITER $$
CREATE TRIGGER 限制订单金额
BEFORE INSERT ON 订单
FOR EACH ROW
BEGINIF NEW.总金额 < 0 OR NEW.总金额 > 10000 THENSIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '订单总金额无效';END IF;
END $$
DELIMITER ;

数据完整性与性能优化

在设计和维护数据库时,数据完整性和性能之间往往需要找到平衡点。过多的约束和检查可能会影响数据库的性能,尤其是在高并发或大数据量的环境中。因此,我们在设计时需要考虑一些优化策略。

使用索引优化查询

索引可以显著提高查询速度,尤其是在涉及大量数据的表中。然而,索引的创建需要谨慎,因为过多的索引会增加插入、更新和删除操作的成本。

**示例:**为订单表的顾客ID创建索引,以加快按顾客查询订单的速度。

CREATE INDEX idx_顾客ID ON 订单(顾客ID);

事务管理与锁机制

事务管理和锁机制是确保并发控制和数据一致性的关键。事务允许你将一组操作作为一个整体进行处理,即使在出现错误的情况下,也能回滚到事务开始前的状态,从而避免数据的不一致性。

**示例:**在订单处理系统中,确保库存的减少和订单的创建在同一个事务中完成。

START TRANSACTION;
UPDATE 库存 SET 数量 = 数量 - 1 WHERE 产品ID = 101 AND 数量 > 0;
INSERT INTO 订单 (顾客ID, 产品ID, 数量, 总金额) VALUES (1, 101, 1, 100);
COMMIT;

使用视图和物化视图

视图是一种虚拟表,可以用于简化复杂查询,或者将常用的查询逻辑封装起来。而物化视图则将查询结果存储起来,可以在需要时直接访问,大大提升查询性能,尤其是在复杂查询或大数据量分析时。

**示例:**创建一个视图,用于显示每个顾客的订单总数和总金额。

CREATE VIEW 顾客订单统计 AS
SELECT 顾客ID, COUNT(*) AS 订单总数, SUM(总金额) AS 总金额
FROM 订单
GROUP BY 顾客ID;

实战案例:构建一个完整的订单管理系统

通过前面介绍的各种技术和概念,我们将它们应用于一个实际案例中,设计并实现一个完整的订单管理系统。

系统需求

  1. 管理顾客信息,包括姓名、电话等。
  2. 管理产品信息,包括产品名称、价格和库存。
  3. 记录顾客订单,包括订单时间、订单明细和订单金额。
  4. 确保数据的一致性和完整性,包括防

止重复数据、确保外键关系、维护业务规则等。

数据库设计

根据系统需求,我们设计以下表结构:

  1. 顾客表(Customers):存储顾客的基本信息。
  2. 产品表(Products):存储产品的详细信息,包括价格和库存。
  3. 订单表(Orders):存储订单的总体信息。
  4. 订单明细表(OrderDetails):存储每个订单中的具体产品信息。
-- 顾客表
CREATE TABLE Customers (CustomerID INT PRIMARY KEY AUTO_INCREMENT,Name VARCHAR(100) NOT NULL,Phone VARCHAR(20) UNIQUE NOT NULL
);-- 产品表
CREATE TABLE Products (ProductID INT PRIMARY KEY AUTO_INCREMENT,ProductName VARCHAR(100) NOT NULL,Price DECIMAL(10, 2) CHECK (Price > 0),Stock INT CHECK (Stock >= 0)
);-- 订单表
CREATE TABLE Orders (OrderID INT PRIMARY KEY AUTO_INCREMENT,CustomerID INT,OrderDate DATETIME DEFAULT CURRENT_TIMESTAMP,TotalAmount DECIMAL(10, 2),FOREIGN KEY (CustomerID) REFERENCES Customers(CustomerID)
);-- 订单明细表
CREATE TABLE OrderDetails (OrderDetailID INT PRIMARY KEY AUTO_INCREMENT,OrderID INT,ProductID INT,Quantity INT CHECK (Quantity > 0),UnitPrice DECIMAL(10, 2) CHECK (UnitPrice > 0),FOREIGN KEY (OrderID) REFERENCES Orders(OrderID),FOREIGN KEY (ProductID) REFERENCES Products(ProductID)
);

实现业务逻辑

在设计完表结构后,我们需要实现业务逻辑,以确保系统能够正确处理订单,并维护数据的一致性。

插入订单并更新库存

当顾客下订单时,我们需要更新库存,并记录订单和订单明细。如果库存不足,订单应失败。

DELIMITER $$CREATE PROCEDURE PlaceOrder(IN custID INT, IN prodID INT, IN qty INT)
BEGINDECLARE prodPrice DECIMAL(10, 2);DECLARE stockQty INT;-- 获取产品价格和库存SELECT Price, Stock INTO prodPrice, stockQty FROM Products WHERE ProductID = prodID;-- 检查库存是否足够IF stockQty < qty THENSIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '库存不足,无法完成订单';ELSE-- 创建订单INSERT INTO Orders (CustomerID, TotalAmount) VALUES (custID, prodPrice * qty);-- 获取新订单IDSET @newOrderID = LAST_INSERT_ID();-- 插入订单明细INSERT INTO OrderDetails (OrderID, ProductID, Quantity, UnitPrice)VALUES (@newOrderID, prodID, qty, prodPrice);-- 更新库存UPDATE Products SET Stock = Stock - qty WHERE ProductID = prodID;END IF;
END $$DELIMITER ;
查询订单统计

创建一个视图来查看每个顾客的订单数量和总金额。

CREATE VIEW CustomerOrderSummary AS
SELECT c.CustomerID, c.Name, COUNT(o.OrderID) AS OrderCount, SUM(o.TotalAmount) AS TotalSpent
FROM Customers c
LEFT JOIN Orders o ON c.CustomerID = o.CustomerID
GROUP BY c.CustomerID, c.Name;

性能优化与扩展

在这个简单的订单管理系统中,我们可以进一步优化和扩展。

  1. 索引优化:为OrderDateProductName等经常查询的字段创建索引,提高查询速度。

    CREATE INDEX idx_OrderDate ON Orders(OrderDate);
    CREATE INDEX idx_ProductName ON Products(ProductName);
    
  2. 分区表:如果订单数据量巨大,可以考虑对Orders表进行分区,例如按年份或月份分区,以提升查询和管理性能。

  3. 备份与恢复:为了防止数据丢失,定期备份数据库非常重要。使用MySQL的mysqldump工具进行备份,并测试恢复过程。

常见问题与解决方案

问题1:如何处理并发订单操作导致的库存问题?

并发订单可能导致库存的竞争条件。可以使用MySQL的行级锁(如SELECT ... FOR UPDATE)来锁定行,确保操作的原子性。

START TRANSACTION;-- 锁定库存行
SELECT Stock FROM Products WHERE ProductID = 101 FOR UPDATE;-- 更新库存和插入订单
CALL PlaceOrder(1, 101, 2);COMMIT;

问题2:如何处理订单金额计算错误?

在插入订单明细后,我们可以通过触发器重新计算订单的总金额,确保准确性。

DELIMITER $$CREATE TRIGGER CalculateOrderTotal
AFTER INSERT ON OrderDetails
FOR EACH ROW
BEGINDECLARE newTotal DECIMAL(10, 2);-- 重新计算订单总金额SELECT SUM(UnitPrice * Quantity) INTO newTotal FROM OrderDetails WHERE OrderID = NEW.OrderID;-- 更新订单表的总金额UPDATE Orders SET TotalAmount = newTotal WHERE OrderID = NEW.OrderID;
END $$DELIMITER ;

总结

表结构设计与数据完整性是数据库设计中至关重要的两个方面。一个好的表结构设计不仅能有效地存储数据,还能保证数据的高效查询和管理。数据完整性则确保了数据库在任何情况下都能保持数据的准确性和一致性。通过合理的设计、适当的约束和优化策略,我们可以构建一个既强大又高效的数据库系统。

在实际操作中,面对复杂的业务需求和性能挑战,数据库设计者需要在规范化和反规范化、完整性和性能之间找到一个平衡点。这不仅需要技术能力,还需要对业务需求的深入理解和丰富的经验积累。

希望通过本文的介绍,你能够更好地理解表结构设计与数据完整性的重要性,并在实际工作中应用这些知识,构建高质量的数据库系统。

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux:开发工具(2)

一、Linux编译器-gcc/g使用 1.1 为什么我们可以用C/C做开发呢&#xff1f; 无论是在windows、还是Linux中&#xff0c;C的开发环境不仅仅指的是vs、gcc、g&#xff0c;更重要的是语言本身的头文件&#xff08;函数的声明&#xff09;和库文件&#xff08;函数的实现&#xff0…

Cesium 实战 - 自定义纹理材质系列之 - 半球雷达效果(力场闪烁)

Cesium 实战 - 自定义纹理材质系列之 - 半球雷达效果(力场闪烁) 核心代码完整代码在线示例Cesium 给实体对象(Entity)提供了很多实用的样式,基本满足普通项目需求; 但是作为 WebGL 引擎,肯定不够丰富,尤其是动态效果样式。 对于实体对象(Entity),可以通过自定义材…

后端Web之数据库(以MySQL为例)

目录 1.概述 2.MySQL 3.DDL 4.DML 5.DQL 1.概述 对于我们自己写的一些小功能&#xff0c;数据一般存储在文件中&#xff0c;比如XML文件。而在实际项目中&#xff0c;数据都是存放在数据库中的。数据库&#xff08;DataBase &#xff09;是一个存储数据的集合&#xff0c…

OpenCv图像处理: 时域滤波与频域滤波

时域滤波&#xff1a; 空间域滤波的步骤一般如下&#xff1a; 1. 选择滤波器 选择一种低通滤波器&#xff0c;常见的包括&#xff1a; 均值滤波&#xff08;平均滤波器&#xff09;高斯滤波&#xff08;Gaussian filter&#xff09; 2. 定义滤波器核 根据选择的滤波器类型&…

【C++篇】迈入新世界的大门——初识C++(上篇)

文章目录 C发展历史C起源C版本更新C23小故事 C在工作领域的应用C参考网站及文档书籍编程语言排行榜C难度参考文档书籍参考文档参考书籍 C第一个程序命名空间为什么要使用namespacenamespace定义及规则命名空间使用 C输入&输出名字含义 缺省参数函数重载 C发展历史 C起源 …

VUE中出现Cannot find module ‘@/api/xxx.js‘ or its corresponding type declarations

在使用VSCode编写Vue程序时发现之前使用以下代码时却报出了错误 import {getEmployeeList} from /api/employee\ 保证文件地址正确且其中的方法也可以正常调用&#xff0c;只是报出了错误&#xff0c;该行代码上加入一个‘//ts-ignore’就可以解决。 修改后的代码 //ts-ig…

python基础篇(15):闭包

在函数嵌套的前提下&#xff0c;内部函数使用了外部函数的变量&#xff0c;并且外部函数返回了内部函数&#xff0c;我们把这个使用外部函数变量的内部函数称为闭包。 1 简单闭包 def outer(logo):def inner(msg):print(f"<{logo}>{msg}<{logo}>")retu…

苹果(ios)私钥证书和profile文件申请教程

苹果&#xff08;ios&#xff09;私钥证书&#xff0c;可以理解为p12后缀的苹果证书&#xff0c;我们在苹果开发者中心可以生成cer格式的证书&#xff0c;然后使用mac电脑或者第三方转换成p12后缀格式的私钥证书。 证书profile文件&#xff0c;又叫描述文件&#xff0c;这个文…

Android系统和开发--安全性和权限管理 SELinux 策略 安全架构

学习android权限知识 SElinux chmod -R 777 ./ setenforce 0 adb root su fastboot oem at-unlock-vboot adb disable-verity Android权限 Android系统是基于Linux内核构建的&#xff0c;因此它继承了Linux的权限管理机制。Android应用需要通过声明权限来访问系统的某些功能&…

融资融券利率和手续费详情,融资融券开通门槛50W资产必须沪深市值?

融资融券利率和手续费 融资融券就是可以向证券公司借钱借券来进行证券交易&#xff0c;实现杠杆操作。融资是向证券公司借款买入股票&#xff0c;而融券则是向证券公司借入股票并卖出。 融资融券的利率是浮动的、个性化的&#xff0c;但一般最低可以达到4.0%~5.0%&#xff0c…

Selenium + Python 自动化测试14(发送报告)

我们的目标是&#xff1a;按照这一套资料学习下来&#xff0c;大家可以独立完成自动化测试的任务。 上一篇我们讨论了使用HTMLTestRunner 生成HTML报告的方法。 本篇文章我们接着讲生成HTML报告是否可以自动邮件发送出去&#xff0c;提高我们测试报告的及时性&#xff0c;方便…

WordPress美化节日灯笼插件,适合春节的时候使用

源码介绍&#xff1a; WordPress美化节日灯笼插件&#xff0c;适合每年过年的时候安在网站上使用&#xff0c;这款插件可以备用着&#xff0c;一款WordPress节日灯笼美化插件&#xff0c;可以给网页自动加一个灯笼效果使用说明&#xff1a;到网站WP后台 - 插件 - 安装插件 - 上…

Java代码基础算法练习-乘阶求和-2024.08.18

对应的源代码可以在我的 Gitee 仓库中找到&#xff0c;欢迎star~ [Gitee 仓库](https://gitee.com/yukongji/java-basic-algorithm) 任务描述&#xff1a; 求Sn1!2!3!4!5!…n!之值&#xff0c;其中n是一个数字(n<10)。 解决思路&#xff1a; 输入: 读取用户输入的 n 值。检查…

Android:使用Gson常见问题(包含解决将Long型转化为科学计数法的问题)

一、解决将Long型转化为科学计数法的问题 1.1 场景 将一个对象转为Map类型时&#xff0c;调用Gson.fromJson发现&#xff0c;原来对象中的long类型的personId字段&#xff0c;被解析成了科学计数法&#xff0c;导致请求接口失败&#xff0c;报参数错误。 解决结果图 1.2、Exa…

leetcode108.把升序数组转换成二叉搜索树

题目描述 [-10,-3,0,5,9] 转换成如下二叉搜索树&#xff1a; 解题的核心原理是&#xff1a;二叉搜索树的中序遍历结果是一个升序数组&#xff0c;所以根节点的数值&#xff0c;也位于数组的中部。 class Solution {public TreeNode sortedArrayToBST(int[] nums) {return h…

基于Hadoop的汽车大数据分析系统设计与实现【爬虫、数据预处理、MapReduce、echarts、Flask】

文章目录 有需要本项目的代码或文档以及全部资源&#xff0c;或者部署调试可以私信博主项目介绍爬虫数据概览HIve表设计Cars Database Tables1. cars_data2. annual_sales_volume3. brand_sales_volume4. city_sales_volume5. sales_volume_by_year_and_brand6. sales_distribu…

MATLAB 手动实现一种高度覆盖值提取建筑物点云的方法(74)

专栏往期文章,包含本章 MATLAB 手动实现一种高度覆盖值提取建筑物点云的方法(74) 一、算法介绍二、算法实现1.代码2.效果总结一、算法介绍 手动实现一种基于高度覆盖值的建筑物点云提取方法,适用于高大的城市建筑物,比只利用高度提取建筑物的方法更加稳定和具有价值,主要…

IntelliJ IDEA 集成 ShardingSphere-JDBC 访问分库分表

背景 众所周知&#xff0c;IntelliJ IDEA 是 Java 领域常用的开发工具之一&#xff0c;IDEA Ultimate&#xff08;旗舰版&#xff09;或其他例如 DataGrip 等 Intellij 平台的工具都集成了对数据库的访问能力。 但是&#xff0c;对于做了分库分表的项目&#xff0c;直接使用 …

消防隐患在线小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;消防隐患举报管理&#xff0c;消防隐患分类管理&#xff0c;统计分类管理&#xff0c;处理结果管理&#xff0c;系统管理 微信端账号功能包括&#xff1a;系统首页&#xff0c;我…

学习笔记 韩顺平 零基础30天学会Java(2024.8.18)

P514 Vector源码解读 P515 双向链表模拟 LinkedList的添加和删除可以通过改变节点的指向完成 遍历的时候&#xff0c;如果要重新遍历&#xff0c;要把指针调回到最前面或者最后面&#xff0c;才能重新全部遍历一次 插入的时候&#xff0c;插入对象的next和pre都要操作&#xff…