数仓规范:命名规范如何设计?

news2024/9/23 1:58:59

目录

0 前言

1 表命名规范

2 字段命名规范

 3 任务命名规范

 4 层级命名规范

5 自定义函数命名规范

 6 视图和存储过程的命名规范

7 综合案例分析

8 常见陷阱和如何避免 

9 工具和最佳实践

10 小结

想进一步了解数仓建设这门艺术的,可以订阅我的专栏数字化建设通关指南,将在该专栏进行详细解析。

专栏 原价99,现在活动价39.9,按照阶梯式增长,还差3个名额将上升至59.9,直到恢复原价。

数字化建设通关指南


35687fd971a64b079ceda986951902af.png

0 前言

数据仓库建设的目的仍是为了下游应用,因此,降低下游用户的应用成本是至关重要的。下面这些问题,你可以看看是否遇到过。很多表名非常类似,涉及各个层级的数据,也不知道粒度如何,用起来非常混乱!表内的字段名特别乱,甚至不同表中相同含义字段的命名不一致!任务名与表名差异很大,很难找到表对应的调度任务是哪一个!以上这些问题,都是由于命名不规范所导致的。那规范的命名又包括哪些方面呢?下面,我们一起来看一下。

1 表命名规范

表命名,核心原则是“见名知意”​,通过规范的标准,降低用户的识别成本。表命名的通用方式为[数据分层]_[业务域]_[内容描述]_[刷新周期]​_[存储策略]

1.1 前缀命名
维表 命名形式:dim_描述
事实表 命名形式:fact_描述_[AB]
临时表 命名形式:tmp_ 正式表名_ [C自定义序号]
宽表 命名形式:dws_主题_描述_[AB]
备份表 命名形式:正式表名_bak_yyyymmdd
表命名解释:

1)表名使用英文小写字母,单词之间用下划线分开,长度不超过40个字符,命名一般控制在小于等于6级。
2)其中ABC第一位"A"时间粒度:使用"c"代表当前数据,"h"代表小时数据,"d"代表天数据,"w"代表周数据,"m"代表月数据,"q"代表季度数据, "y"代表年数据。
3)其中ABC的第二位"B"表示对象属性,用"t"表示表,用"v"表示视图。
4)其中ABC的第三位"C"自定义序号用于标识多个临时表的跑数顺序。

1.2 注释
注释要结合表的英文名,要求注释简洁明了,体现出表的业务出处、主题和用途。

1.3 存储格式
所谓的存储格式就是在Hive建表的时候指定的将表中的数据按照什么样子的存储方式,如果指定了方式,那么在向表中插入数据的时候,将会使用该方式向HDFS中添加相应的数据类型。在数仓中建表默认用的都是PARQUET存储格式,相关语句如下所示:

STORED AS INPUTFORMAT

‘org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat’

OUTPUTFORMAT

‘org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat’

1.4 字符集
Hadoop和hive 都是用utf-8编码的,在建表时可能涉及到中文乱码问题,所以导入的文件的字符编码统一为utf-8格式。

1.5 约定
理论上在数仓落地的表不应该出现null未知类型,对于可能出现null的字段,如果为字符型统一为空字符串,如果是数值则给0。

1.6 刷新周期

aedbbf3e40f444608587c62f61ab5612.png

1.7 存储策略

efdb372e35c34da0a0249e5a2ccd2a2f.png

  1. 8 来源系统:如果数据来自特定的源系统,可以在名称中标注。

    例如:_erp_crm_pos

示例:

-- 创建订单事实表(每日粒度)
CREATE TABLE fact_order_daily (
    order_id INT,
    customer_id INT,
    order_date DATE,
    total_amount DECIMAL(10,2),
    -- 其他字段...
);

-- 创建客户维度表
CREATE TABLE dim_customer (
    customer_id INT,
    customer_name VARCHAR(100),
    customer_email VARCHAR(100),
    -- 其他字段...
);

-- 创建来自ERP系统的库存汇总表(月度粒度)
CREATE TABLE dws_inventory_monthly_erp (
    product_id INT,
    warehouse_id INT,
    month_date DATE,
    avg_stock_qty INT,
    -- 其他字段...
);

-- 创建临时表用于数据处理
CREATE TABLE tmp_order_analysis (
    -- 临时分析用字段...
);

 注意点:

  1. 全小写:使用全小写字母,避免大小写敏感性问题。

  2. 下划线连接:使用下划线 _ 连接不同的单词,提高可读性。

  3. 避免特殊字符:不要使用空格、横杠或其他特殊字符。

  4. 长度限制:表名长度应控制在64个字符以内,以适应大多数数据库系统的限制。

2 字段命名规范

字段命名作用同表命名作用一致,同样是为了减少应用上的歧义。字段命名需要遵循以下几项原则。

  • 字段名需含义清晰,唯一解释,不可出现同名不同义的情况。
  • 字段名建议用英文简写,不建议用拼音,更不建议用拼音简写。
  • 字段名一律小写,避免出现混乱的情况。·
  • 字段名各单词间用下画线进行分割。字段名长度不宜过长,建议控制在20个字符以内。

1)修饰词

修饰词是对指标场景的描述,例如PV是一个原子指标,那么主页PV、列表页PV、详情页PV就是在PV基础上增加的修饰词,将原子指标包装成一个用于描述特定场景的数据。

 2)原子指标

原子指标可以理解为指标的内核、业务指标的最小颗粒度,例如PV、UV、人均PV、人均时长等。根据指标的类型,原子指标的命名规范如图3-20所示。

73133ec43f8a4a41b7c83896ae29ad59.png

3)时间修饰

大多数情况下,指标描述的是当日的数据表现,但仍有些应用场景,需要记录过去或者未来一段时间的表现情况。例如,过去7日搜索PV、过去第7日搜索PV、未来7日搜索PV、未来第7日搜索PV等。对于这种需要跨度的时间修饰,命名需要遵循一定原则,用以区分过去/未来、N日内/第N日,如图所示。 

870cce8c26594c1b9d6250af0ae95c8d.png

3) 派生指标

e86c59e61b3d462fadac89b6320df565.png

4)衍生指标

ffbb7770099a4ac8ad6ea29e27699120.png

 注意点:

(1)前缀使用:对于特定类型的字段,可以使用前缀。

  • is_ 表示布尔值(例如:is_active)
  • has_ 表示布尔值(例如:has_children)
  • num_ 表示计数(例如:num_orders)
  • pct_ 表示百分比(例如:pct_discount)
  • amt_ 表示金额(例如:amt_total)


时间字段:对于时间相关的字段,使用统一的命名方式。

  • date 后缀表示日期(例如:order_date)
  • time 后缀表示时间(例如:login_time)
  • timestamp 后缀表示时间戳(例如:create_timestamp)

主键:主键字段通常使用 id 作为后缀。

例如:customer_id、order_id
外键:外键字段应与引用表的主键名称保持一致。

例如:如果 customer 表的主键是 customer_id,那么在 order 表中引用它的外键也应该叫 customer_id

全小写:使用全小写字母。

下划线连接:使用下划线 _ 连接不同的单词。

避免保留字:不要使用数据库的保留字作为字段名。

避免缩写:除非是广为人知的缩写(如 ID),否则应使用完整单词。

一致性:相同含义的字段在不同表中应保持一致的命名。

 示例:

CREATE TABLE fact_order (
    order_id INT PRIMARY KEY,
    customer_id INT,  -- 外键,引用 dim_customer 表
    order_date DATE,
    order_timestamp TIMESTAMP,
    total_amount DECIMAL(10,2),
    num_items INT,
    is_paid BOOLEAN,
    payment_method VARCHAR(50),
    discount_pct DECIMAL(5,2),
    shipping_amt DECIMAL(8,2),
    has_gift_wrap BOOLEAN,
    -- 其他字段...
);

CREATE TABLE dim_customer (
    customer_id INT PRIMARY KEY,
    customer_name VARCHAR(100),
    customer_email VARCHAR(100),
    registration_date DATE,
    is_active BOOLEAN,
    last_login_timestamp TIMESTAMP,
    lifetime_value DECIMAL(12,2),
    -- 其他字段...
);

在这个例子中,我们可以看到:

  • 字段名清晰描述了其内容(例如 total_amount、num_items)
  • 使用了适当的前缀(例如 is_paid、discount_pct)
  • 时间相关字段使用了统一的后缀(_date、_timestamp)
  • 主键和外键的命名保持一致(customer_id)
  • 所有字段名都是小写并使用下划线连接
  • 通过遵循这些规则,我们可以创建出清晰、一致且易于理解的数据模型,大大提高了数据仓库的可用性和可维护性。

 

 3 任务命名规范

表的生成代码往往需要配置一个调度任务加以完成,这里需要注意,调度任务命名需与表命名一致,建议采用相同的名称,如果已被占用,建议使用表命名作为基准,增加后缀作为任务命名,方便后续查找应用。

命名规范

  •      ETL 脚本名称尽可能和所产出的表同名;
  •      数据采集、数据推送脚本尽可能标识数据去向;
  •      ETL 脚本若产生多个表,采用对应的数据域和语义描述命名;
  •      Jar 包命名以实际的业务处理逻辑语义描述为主,调度任务命名同样尽量以产出表名命名根据脚本命名规范。

具体实例
     我们对如下的脚本进行命名:

      数据导出脚本命名:
      dws_jttl_pull_month_tmp_exp.sh,其中exp表示向外导出用于标识方向

       ETL过程脚本命名:
        dws_jttl_pull_month.sh

       一个ETL脚本产生多个表:
        dws_phm_switchshock_min_hh_mm.sh

        该脚本文件描述了按分钟、小时、月份转辙机振动的监控数据。说明了该脚本有三张表

        一张按分钟统计的表,一张按小时统计的表、一张按月份统计的表。

        调度任务命名:
        dws_jttl_pull_day
 

 4 层级命名规范

 参考

63fea1f233ba4e04a00a3d1cd9ccdccb.png

5 自定义函数命名规范

自定义函数命名规范在表的生成过程中,一般会用到SQL的内置函数,然而在面对一些复杂逻辑,内置函数无法满足需求时,往往需要自己创建函数,以满足对应的应用场景。为了便于应用及管理,自定义函数命名需要遵循一定规范。自定义函数命名的通用方式为[业务域]_udf/udaf/udtf_[内容描述],以“城市等级划分函数”为例,如图所示。 

42691e7446a84d15a893b79f0db07e05.png

 6 视图和存储过程的命名规范

 

视图和存储过程是数据仓库中重要的对象,它们的命名同样需要遵循一定的规范,以确保整个系统的一致性和可读性。

(1)视图命名规范

  • 前缀使用:使用 v_ 作为视图的前缀。
  • 目的描述:在前缀后添加描述视图目的或内容的词语。
  • 数据粒度:如果视图代表特定的数据粒度,可以在名称中体现。
  • 全小写:使用全小写字母。
  • 下划线连接:使用下划线 _ 连接不同的单词。
-- 创建一个展示每日销售汇总的视图
CREATE VIEW v_sales_daily_summary AS
SELECT 
    order_date,
    SUM(total_amount) as daily_sales,
    COUNT(DISTINCT customer_id) as unique_customers
FROM fact_order
GROUP BY order_date;

-- 创建一个展示高价值客户的视图
CREATE VIEW v_high_value_customers AS
SELECT *
FROM dim_customer
WHERE lifetime_value > 10000;

 

(2)存储过程命名规范

  • 前缀使用:使用 p_ 作为存储过程的前缀。

  • 动作描述:在前缀后添加描述存储过程主要动作的动词。

  • 对象描述:在动作后添加存储过程操作的主要对象。

  • 全小写:使用全小写字母。

  • 下划线连接:使用下划线 _ 连接不同的单词。

 

-- 创建一个更新客户终身价值的存储过程
CREATE PROCEDURE p_update_customer_lifetime_value
AS
BEGIN
    -- 存储过程的具体实现
END;

-- 创建一个生成每月销售报告的存储过程
CREATE PROCEDURE p_generate_monthly_sales_report
    @year INT,
    @month INT
AS
BEGIN
    -- 存储过程的具体实现
END;

7 综合案例分析

假设我们正在为一家在线零售公司构建数据仓库,主要包括订单、客户、产品和销售等数据。

-- 创建数据库
CREATE DATABASE prod_ecommerce_dw_v1;

USE prod_ecommerce_dw_v1;

-- 创建维度表
CREATE TABLE dim_customer (
    customer_id INT PRIMARY KEY,
    customer_name VARCHAR(100),
    customer_email VARCHAR(100),
    registration_date DATE,
    is_active BOOLEAN,
    last_login_timestamp TIMESTAMP
);

CREATE TABLE dim_product (
    product_id INT PRIMARY KEY,
    product_name VARCHAR(200),
    category_id INT,
    category_name VARCHAR(100),
    brand_name VARCHAR(100),
    unit_price DECIMAL(10,2)
);

-- 创建事实表
CREATE TABLE fact_order (
    order_id INT PRIMARY KEY,
    customer_id INT,
    order_date DATE,
    order_timestamp TIMESTAMP,
    total_amount DECIMAL(12,2),
    num_items INT,
    is_paid BOOLEAN,
    payment_method VARCHAR(50),
    dt STRING
)
PARTITIONED BY (dt);

-- 创建汇总表
CREATE TABLE dws_daily_sales (
    dt STRING,
    total_sales DECIMAL(15,2),
    total_orders INT,
    avg_order_value DECIMAL(10,2),
    num_unique_customers INT
)
PARTITIONED BY (dt);

-- 创建视图
CREATE VIEW v_top_selling_products AS
SELECT 
    p.product_id,
    p.product_name,
    SUM(fo.num_items) as total_sold,
    SUM(fo.total_amount) as total_revenue
FROM fact_order fo
JOIN dim_product p ON fo.product_id = p.product_id
GROUP BY p.product_id, p.product_name
ORDER BY total_sold DESC
LIMIT 100;

-- 创建存储过程
CREATE PROCEDURE p_update_daily_sales_summary(IN target_date DATE)
BEGIN
    INSERT INTO dws_daily_sales
    SELECT 
        DATE_FORMAT(target_date, '%Y%m%d') as dt,
        SUM(total_amount) as total_sales,
        COUNT(DISTINCT order_id) as total_orders,
        AVG(total_amount) as avg_order_value,
        COUNT(DISTINCT customer_id) as num_unique_customers
    FROM fact_order
    WHERE DATE(order_date) = target_date;
END;

 

在这个案例中,我们可以看到:

数据库名称 prod_ecommerce_dw_v1 清晰地表明了这是生产环境的电子商务数据仓库,版本为1。

维度表使用 dim_ 前缀,如 dim_customer 和 dim_product。

事实表使用 fact_ 前缀,如 fact_order。

汇总表使用 dws_ 前缀,如 dws_daily_sales。

所有表和字段名都使用小写字母和下划线。

视图使用 v_ 前缀,如 v_top_selling_products。

存储过程使用 p_ 前缀,如 p_update_daily_sales_summary。

分区字段使用 dt,格式为 yyyymmdd。

8 常见陷阱和如何避免 

在实施数据仓库命名规范时,有一些常见的陷阱需要注意:

  • 过度缩写:为了节省空间而过度使用缩写可能导致命名难以理解。
  • 避免方法:除非是广为人知的缩写,否则尽量使用完整词汇。
  • 不一致性:在不同的表或模块中使用不同的命名风格。
  • 避免方法:制定详细的命名指南,并定期审查以确保一致性。
  • 使用特殊字符:在名称中使用特殊字符可能导致SQL语句编写困难。
  • 避免方法:仅使用字母、数字和下划线。
  • 使用保留字:使用数据库的保留字作为对象名称。
  • 避免方法:熟悉所使用数据库系统的保留字列表,避免使用这些词。
  • 忽视业务含义:纯粹从技术角度命名,忽视业务含义。
  • 避免方法:在命名时考虑业务用户的理解,使用业务术语。
  • 命名过长:创建过长的名称,超出数据库系统的限制。
  • 避免方法:在保证清晰的前提下,控制名称长度,通常不超过64个字符。
  • 重复信息:在字段名中重复表名中已包含的信息。
  • 避免方法:例如,在 customer 表中,不要使用 customer_name,直接用 name 即可。
  • 使用数字前缀:某些数据库可能不支持以数字开头的标识符。
  • 避免方法:始终以字母开头命名。
  • 忽视未来扩展:命名不考虑未来可能的扩展需求。
  • 避免方法:设计命名方案时考虑可能的未来变化,预留扩展空间。
  • 混用大小写:在一些大小写敏感的数据库中可能导致问题。
  • 避免方法:统一使用小写,即使在不区分大小写的数据库中也是如此。

通过注意这些陷阱并采取相应的避免措施,我们可以创建一个更加健壮和可维护的数据仓库命名系统。

9 工具和最佳实践


为了更好地实施和维护数据仓库命名规范,我们可以利用一些工具和最佳实践:

数据字典:维护一个详细的数据字典,记录所有表、字段的名称、含义和用途。

工具推荐:Confluence, Microsoft Excel, Dataedo

命名规则检查器:使用自动化工具检查命名是否符合规范。

工具推荐:SQL Prompt, ApexSQL Refactor

版本控制:使用版本控制系统管理数据库脚本和文档。

工具推荐:Git, SVN

自动化文档生成:使用工具自动生成数据库文档,包括表结构、关系图等。

工具推荐:Dataedo, SchemaSpy

代码审查:实施严格的代码审查流程,确保新添加的对象符合命名规范。

工具推荐:GitHub, GitLab, Bitbucket

培训和指南:为团队成员提供详细的命名规范指南和培训。

定期审计:定期审查数据仓库对象,确保它们持续符合命名规范。

元数据管理:使用元数据管理工具来维护和管理数据仓库的结构信息。

工具推荐:Alation, Collibra

命名模板:创建标准化的命名模板,特别是对于复杂的对象如存储过程和视图。

自动化重命名工具:使用工具批量重命名不符合规范的对象。

工具推荐:ApexSQL Refactor, Redgate SQL Prompt
 

示例:使用Python脚本检查表名是否符合规范 

import re

def check_table_name(name):
    pattern = r'^(dim|fact|dws|ods|tmp)_[a-z0-9_]+$'
    if re.match(pattern, name):
        return True
    else:
        return False

# 测试
table_names = ['dim_customer', 'FACT_ORDER', 'dws_daily_sales', 'TempTable']
for name in table_names:
    if check_table_name(name):
        print(f"{name} is valid")
    else:
        print(f"{name} is not valid")

通过使用这些工具和最佳实践,我们可以更有效地实施和维护数据仓库命名规范,提高整个团队的工作效率和数据质量。 

 

参考链接:https://blog.csdn.net/u012955829/article/details/142420972

 

10 小结

想进一步了解数仓建设这门艺术的,可以订阅我的专栏数字化建设通关指南,将在该专栏进行详细解析。

专栏 原价99,现在活动价39.9,按照阶梯式增长,还差3个名额将上升至59.9,直到恢复原价。


数字化建设通关指南

主要内容:


(1)SQL进阶实战技巧

可以参考如下教程,具体链接如下

SQL很简单,可你却写不好?也许这才是SQL最好的教程

上面链接中的文章及技巧会不定期更新。

(2)数仓建模实战技巧和个人心得

       1)新人入职新公司后应如何快速了解业务?

       2)以业务视角看宽表化建设?

       3)  维度建模 or 关系型建模?

       4)业务模型与数据模型有什么区别?业务阶段的模型该如何建设?

       5)业务指标体系该如何建设?指标体系该如何维护?指标平台应如何建设?指标体系                           该由谁来搭建?

       6)如何优雅设计DWS层?DWS层模型好坏该如何评价?

       7)指标发生异常,该如何排查?应从哪些方面入手寻找问题点?

       8) 数据架构的选择,mpp or hadoop?

       9)数仓团队应如何体现自己的业务价值,讲好数据故事?

       10)BI与大数据有什么关系?BI与信息化、数字化之间有什么关系?BI与报表之间的关                          系?

       11)数据部门如何与业务部门沟通,并规划指引业务需求?

 

文章不限于以上内容,有新的想法也会及时更新到该专栏。

具体专栏链接如下:

数字化建设通关指南_莫叫石榴姐的博客-CSDN博客

cb52e29eec8d48729502af9db8954177.png

 

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

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

相关文章

深度学习02-pytorch-03-张量的数值计算

张量(Tensor)是多维数组的通用化概念,它可以表示标量(0维)、向量(1维)、矩阵(2维)以及更高维度的数据。在深度学习和数值计算中,张量是基础数据结构&#xff…

[Python学习日记-27] 文件操作练习题解析

[Python学习日记-27] 文件操作练习题解析 简介 练习题1——全局替换程序 练习题2——模拟登陆 简介 练习题1——全局替换程序 一、题目 写一个脚本,允许用户按以下方式执行时填入参数,即可以对指定文件内容进行全局替换 python your_script.py old…

Mybatis in用法优化

如果in的参数过多&#xff0c;mybatis会报错 原来写法&#xff1a;select * from file_inf a <where>and a.status 0 and a.id in<foreach collection"ids" open"(" close")" separator"," item"id" #{id}</for…

ConflictingBeanDefinitionException | 运行SpringBoot项目时报错bean定义冲突解决方案

具体报错&#xff1a; Caused by: org.springframework.context.annotation.ConflictingBeanDefinitionException: Annotation-specified bean name ‘CommissionMapperImpl’ for bean class [com.xxx.mapper.carrier.CommissionMapperImpl] conflicts with existing, non-co…

MAC激活Typora以及禁止成功激活弹窗的方法

激活 Typora 首先在官网下载 Typora 的最新版 并且安装。 打开以下目录 /Applications/Typora.app/Contents/Resources/TypeMark/page-dist/static/js/ 注意在 Applications 中&#xff0c;需要对 Typora 右键选择 Show Packages Contents 即可进入 Typora.app。 在该目录的文…

探索未来智能:Moonshot AI 引领AI新纪元——M1超级模型

在人工智能的快速演进中&#xff0c;Moonshot AI再次站在了技术创新的前沿。推出M1超级模型&#xff0c;这是一款旨在突破现有AI能力极限的革命性产品。 M1超级模型的诞生背景 随着数据量的爆炸性增长和计算能力的提升&#xff0c;AI模型正变得越来越复杂和强大。M1超级模型…

华为HarmonyOS地图服务 1 -- 如何实现地图呈现?

如何使用地图组件MapComponent和MapComponentController呈现地图&#xff0c;效果如下图所示。 MapComponent是地图组件&#xff0c;用于在您的页面中放置地图。MapComponentController是地图组件的主要功能入口类&#xff0c;用来操作地图&#xff0c;与地图有关的所有方法从此…

从规范到实现解读Windows平台如何播放RTSP流

RTSP播放器应用场景 RTSP播放器在视频监控、远程视频会议、网络电视、实时流媒体传输、协同操控相关的智能设备、教育培训以及企业内部通讯与协作等多个领域都有着广泛的应用场景。 1. 视频监控 RTSP直播播放器在视频监控系统中扮演着重要角色。通过RTSP协议&#xff0c;播放…

Java—SPI 机制详解

参考文章 Java常用机制 - SPI机制详解 | Java 全栈知识体系包含: Java 基础, Java 部分源码, JVM, Spring, Spring Boot, Spring Cloud, 数据库原理, MySQL, ElasticSearch, MongoDB, Docker, k8s, CI&CD, Linux, DevOps, 分布式, 中间件, 开发工具, Git, IDE, 源码阅读&a…

安全带检测系统源码分享

安全带检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Visio…

OpenCV基础入门30讲(Python)——第三讲 图像对象的创建与赋值

在OpenCV里&#xff0c;对图像的操作是最为基本的。接下来我们看一下图像对象的创建与赋值。 注&#xff1a;前文介绍过的代码和操作不再重复。 代码 在 main 文件中&#xff0c;先导入新的模块 # 导入 numpy 模块&#xff0c;重命名为 np import numpy as np 再写进以下代…

一条龙小程序开发教程

初次上手 微信小程序已经成为国内前端的一个重要业务&#xff0c;跟 Web 和手机 App 有着同等的重要性。小程序开发者供不应求&#xff0c;市场招聘需求极其旺盛&#xff0c;企业都抢着要。 尽管如此&#xff0c;小程序的教程却很缺&#xff0c;要么是不够系统&#xff0c;要么…

Python 从入门到实战24(类的继承)

我们的目标是&#xff1a;通过这一套资料学习下来&#xff0c;通过熟练掌握python基础&#xff0c;然后结合经典实例、实践相结合&#xff0c;使我们完全掌握python&#xff0c;并做到独立完成项目开发的能力。 上篇文章我们讨论了类的定义、使用方法、property的相关知识。今…

PHP API 框架:构建高效API的利器

在当今快速发展的互联网时代&#xff0c;API&#xff08;应用程序编程接口&#xff09;已成为连接不同应用程序和服务的关键。PHP&#xff0c;作为一种流行的服务器端脚本语言&#xff0c;提供了多种强大的框架来简化API的开发。本文将介绍PHP API框架的重要性&#xff0c;以及…

嵌入式系统基础讲解

​ 大家好&#xff0c;我是程序员小羊&#xff01; 前言&#xff1a; 嵌入式系统是计算机科学与电子工程的交叉领域&#xff0c;广泛应用于消费电子、工业控制、汽车、医疗设备等多个行业。嵌入式系统设计涉及硬件和软件的协同开发&#xff0c;要求开发者掌握多方面的基础知识。…

Tomcat系列漏洞复现

CVE-2017-12615——Tomcat put⽅法任意⽂件写⼊漏洞 漏洞描述 当 Tomcat运⾏在Windows操作系统时&#xff0c;且启⽤了HTTP PUT请求⽅法&#xff08;例如&#xff0c;将 readonly初始化参数由默认值设置为false&#xff09;&#xff0c;攻击者将有可能可通过精⼼构造的攻击请求…

mybatis 配置文件完成增删改查(四) :多条件 动态sql查询

文章目录 就是你在接收数据时&#xff0c;有的查询条件不写&#xff0c;也能从查到相应的stauts也可能为空恒等式标签 代替where关键字 就是你在接收数据时&#xff0c;有的查询条件不写&#xff0c;也能从查到相应的 注意是写字段名 还是 属性名 companyName不写也能查出满足…

K8s容器运行时,移除Dockershim后存在哪些疑惑?

K8s容器运行时&#xff0c;移除Dockershim后存在哪些疑惑&#xff1f; 大家好&#xff0c;我是秋意零。 K8s版本截止目前&#xff08;24/09&#xff09;已经发布到了1.31.x版本。早在K8s版本从1.24.x起&#xff08;22/05&#xff09;&#xff0c;默认的容器运行时就不再是Doc…

车载测试项目实操学习:CAN通信测试、UDS诊断测试、自动化测试、功能安全测试、CAN一致性测试、HIL测试:9-20

FOTA模块中OTA的知识点&#xff1a;1.测试过程中发现哪几类问题&#xff1f; 可能就是一个单键的ecu&#xff0c;比如升了一个门的ecu&#xff0c;他的升了之后就关不上&#xff0c;还有就是升级组合ecu的时候&#xff0c;c屏上不显示进度条。 2.在做ota测试的过程中&#xff…

【d46】【Java】【力扣】876.链表的中间结点

思路 先获得总体长度&#xff0c; 再得到中间节点 的索引&#xff0c;&#xff0c;这里的索引是从1开始的索引&#xff0c;而不是从0开始的索引(这种理解方式更简单) 排错&#xff1a;另一个思路&#xff1a;将链表都放进list&#xff0c;获得中间的数字&#xff0c;然后遍历…