版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
数据仓库:Snowflake:数据仓库数据治理与Snowflake实践1数据仓库基础概念1.1数据仓库的定义与作用数据仓库(DataWarehouse)是一种用于存储和管理大量数据的系统,主要用于支持业务智能(BusinessIntelligence,BI)活动,特别是分析性报告和决策支持。数据仓库的设计目的是为了提供对历史数据的快速访问和分析,而不是为了日常的业务操作。它通常从各种业务系统(如事务处理系统、关系数据库、外部数据源等)中抽取数据,进行清洗、转换和整合,然后加载到数据仓库中,以支持更高级的数据分析和报告。1.1.1特点集成性:数据仓库中的数据是从多个数据源抽取的,这些数据源可能来自不同的业务系统,数据仓库将这些数据整合在一起,提供统一的数据视图。时间性:数据仓库存储的是历史数据,用于分析过去的数据趋势和模式。稳定性:一旦数据进入数据仓库,通常不会被修改,这保证了数据分析的一致性和准确性。面向主题:数据仓库中的数据是围绕特定的主题组织的,如销售、客户、产品等,这使得数据更容易理解和使用。1.1.2作用决策支持:通过提供历史数据和分析工具,数据仓库帮助决策者做出基于数据的决策。业务分析:数据仓库支持复杂的查询和分析,帮助企业理解业务趋势和模式。合规性:数据仓库可以用于存储和管理需要长期保存的合规数据,如财务记录、交易历史等。1.2数据仓库与数据湖的区别数据湖(DataLake)和数据仓库都是用于存储大量数据的系统,但它们在数据的存储方式、数据的结构和使用目的上存在显著差异。1.2.1数据湖存储方式:数据湖存储原始数据,包括结构化、半结构化和非结构化数据,数据在存储时不进行任何预处理或转换。数据结构:数据湖中的数据可以是任何格式,如CSV、JSON、XML、图像、音频等。使用目的:数据湖主要用于数据探索和机器学习,数据科学家和分析师可以从中提取数据,进行清洗、转换和分析,以发现新的洞察。1.2.2数据仓库存储方式:数据仓库存储的是经过清洗、转换和整合后的数据,通常以优化查询性能的格式存储。数据结构:数据仓库中的数据通常是结构化的,以表格形式存储,便于进行SQL查询和分析。使用目的:数据仓库主要用于支持固定的报告和分析,数据仓库中的数据是为特定的查询和分析需求准备的。1.3数据仓库的架构设计数据仓库的架构设计通常包括以下几个关键组件:源系统:数据仓库的数据来源,可以是事务处理系统、关系数据库、外部数据源等。数据集成层:负责从源系统抽取数据,进行清洗、转换和整合,然后加载到数据仓库中。数据仓库:存储和管理数据的中心,通常包括历史数据和当前数据。数据集市:数据仓库的子集,为特定的用户群或业务部门提供数据。前端工具:用于查询和分析数据仓库中的数据,如BI工具、数据挖掘工具等。1.3.1架构设计原则星型模式:数据仓库中最常见的架构模式,包括一个大的事实表和多个小的维度表,这种模式便于进行快速查询和分析。雪花模式:星型模式的扩展,维度表可以进一步分解为更小的维度表,形成雪花状的结构,这种模式可以提供更详细的数据视图,但查询性能可能不如星型模式。3NF(第三范式):数据仓库中的数据应该遵循第三范式,以减少数据冗余和提高数据一致性。1.3.2示例:星型模式设计假设我们有一个销售数据仓库,其中包含销售数据、产品信息、客户信息和时间信息。我们可以设计以下的星型模式:事实表:Sales,包含销售数据,如销售数量、销售金额等。维度表:Products、Customers、Time,分别包含产品信息、客户信息和时间信息。--创建事实表Sales
CREATETABLESales(
SaleIDINTPRIMARYKEY,
ProductIDINT,
CustomerIDINT,
TimeIDINT,
QuantityINT,
AmountDECIMAL(10,2)
);
--创建维度表Products
CREATETABLEProducts(
ProductIDINTPRIMARYKEY,
ProductNameVARCHAR(255),
ProductCategoryVARCHAR(255)
);
--创建维度表Customers
CREATETABLECustomers(
CustomerIDINTPRIMARYKEY,
CustomerNameVARCHAR(255),
CustomerRegionVARCHAR(255)
);
--创建维度表Time
CREATETABLETime(
TimeIDINTPRIMARYKEY,
YearINT,
MonthINT,
DayINT
);在这个例子中,Sales是事实表,Products、Customers和Time是维度表,它们通过外键(ProductID、CustomerID、TimeID)关联起来,形成了星型模式。这种模式使得我们可以快速查询和分析销售数据,如按产品、客户或时间进行销售分析。2Snowflake入门与架构2.1Snowflake的云数据仓库特性Snowflake是一种完全托管的云数据仓库,它提供了高度的可扩展性、性能和易用性。与传统的数据仓库相比,Snowflake在以下几个方面展现出其独特优势:自动扩展:Snowflake能够根据查询负载自动调整计算资源,无需手动管理。计算与存储分离:这一特性允许用户独立扩展计算和存储资源,降低了成本并提高了效率。多云支持:Snowflake可以在AWS、Azure和GoogleCloud等多个云平台上运行,提供灵活的部署选项。零管理:Snowflake的完全托管特性意味着用户无需担心硬件维护、软件升级或备份等管理任务。2.2Snowflake的架构详解2.2.1三层架构Snowflake的架构主要分为三层:存储层:负责数据的持久化存储,使用标准的列式存储格式,支持数据压缩和加密。计算层:包含虚拟仓库,用于执行SQL查询。虚拟仓库可以独立于存储层进行扩展,实现计算与存储的分离。服务层:提供数据管理、元数据管理、安全性控制和网络服务等功能,确保数据仓库的高效运行。2.2.2虚拟仓库虚拟仓库是Snowflake计算层的核心组件,它是一个独立的计算单元,可以动态调整大小以满足查询需求。用户可以通过以下命令创建和管理虚拟仓库:--创建虚拟仓库
CREATEWAREHOUSEmy_warehouse
WAREHOUSE_SIZE='XSMALL'
AUTO_SUSPEND=300
AUTO_RESUME=TRUE
MIN_CLUSTER_COUNT=1
MAX_CLUSTER_COUNT=10;
--启动虚拟仓库
ALTERWAREHOUSEmy_warehouseRESUME;
--暂停虚拟仓库
ALTERWAREHOUSEmy_warehouseSUSPEND;2.2.3数据共享Snowflake支持数据共享,允许在不同的Snowflake账户之间共享数据,无需复制或导出数据。数据共享可以通过以下命令实现:--创建共享
CREATESHAREmy_share;
--添加表到共享
GRANTSELECTONTABLEmy_schema.my_tableTOSHAREmy_share;
--接受共享
CREATEDATABASEshared_dbFROMSHAREmy_share;2.3Snowflake的计算与存储分离Snowflake的计算与存储分离架构是其核心优势之一。这意味着存储和计算资源可以独立扩展,用户可以根据查询需求动态调整计算资源,而无需担心存储容量的限制。这种架构不仅提高了查询性能,还降低了总体成本。2.3.1实践示例假设我们有一个大型数据集,需要进行频繁的分析查询,但存储成本是一个考虑因素。在Snowflake中,我们可以轻松地调整计算资源,以满足查询需求,同时保持存储成本在可控范围内。--查询数据
SELECTCOUNT(*)FROMmy_large_table;
--调整虚拟仓库大小以提高查询性能
ALTERWAREHOUSEmy_warehouseSETWAREHOUSE_SIZE='LARGE';通过上述示例,我们可以看到,即使数据量很大,通过调整虚拟仓库的大小,我们也能快速执行查询,而无需增加额外的存储成本。2.3.2总结Snowflake的云数据仓库特性、三层架构和计算与存储分离的设计,使其成为现代数据仓库解决方案的佼佼者。通过灵活的资源管理和数据共享功能,Snowflake能够满足各种规模企业的数据处理需求,同时保持高效率和低成本。3数据治理核心原则3.1数据治理的定义与目标数据治理是组织中管理数据资产的一系列过程、策略和实践。其目标在于确保数据的准确性、完整性、可用性、安全性和合规性,从而提升数据价值,支持业务决策和运营。数据治理的关键在于建立一个框架,使数据能够在整个组织中被有效管理和使用。3.1.1目标示例数据质量提升:通过定期的数据质量检查和清洗,确保数据的准确性和完整性。数据安全加强:实施严格的数据访问控制和加密策略,保护数据免受未授权访问和数据泄露。合规性保证:遵守行业标准和法律法规,如GDPR、HIPAA等,确保数据处理的合法性。3.2数据质量的重要性数据质量直接影响到业务决策的准确性和效率。低质量的数据可能导致错误的决策、资源浪费和客户满意度下降。数据质量包括准确性、完整性、一致性、时效性和可靠性等维度。3.2.1数据质量检查示例假设我们有一个销售数据表,包含产品ID、销售日期、销售数量等字段。为了检查数据质量,我们可以运行以下SQL查询:--检查缺失值
SELECTCOUNT(*)
FROMsales_data
WHEREproduct_idISNULLORsales_dateISNULLORsales_quantityISNULL;
--检查数据一致性
SELECTproduct_id,COUNT(DISTINCTsales_date)
FROMsales_data
GROUPBYproduct_id
HAVINGCOUNT(DISTINCTsales_date)>1;这些查询帮助我们识别数据中的缺失值和不一致性,从而采取措施进行数据清洗和校正。3.3数据安全与合规性数据安全是数据治理的重要组成部分,它确保数据在存储、处理和传输过程中的安全。合规性则要求组织遵守相关的法律法规和行业标准,以合法的方式处理数据。3.3.1数据安全实践加密:对敏感数据进行加密,即使数据被截取,也无法直接读取。访问控制:基于角色的访问控制(RBAC),确保只有授权用户可以访问特定数据。审计日志:记录数据访问和修改的历史,以便追踪和审计。3.3.2合规性示例在处理个人数据时,组织必须遵守GDPR(通用数据保护条例)。例如,当用户请求删除其个人数据时,组织应能够执行以下操作:--删除特定用户的所有数据
DELETEFROMuser_data
WHEREuser_id='12345';同时,组织需要确保有适当的记录和流程,以证明数据删除请求已被妥善处理,符合GDPR的要求。以上内容详细阐述了数据治理的核心原则,包括数据治理的定义与目标、数据质量的重要性以及数据安全与合规性的实践。通过这些原则的实施,组织可以更好地管理和利用其数据资产,提升业务效率和决策质量。4Snowflake中的数据治理实践4.1数据分类与标签数据分类与标签是数据治理中的关键步骤,它帮助组织理解和管理其数据资产。在Snowflake中,这一过程可以通过使用元数据管理和角色权限控制来实现。4.1.1原理数据分类涉及识别数据的敏感性和重要性,将其分为不同的类别,如公共、内部、机密等。数据标签则是将这些分类信息附加到数据上,以便于识别和控制访问。4.1.2内容在Snowflake中,可以通过以下方式实现数据分类与标签:使用元数据管理:Snowflake提供了元数据管理功能,允许用户在表、列、视图等数据对象上添加描述性信息,这些信息可以包括数据的分类和标签。角色和权限控制:通过定义不同的角色和权限,可以控制不同用户对不同分类数据的访问。例如,可以创建一个角色,只允许访问标记为“公共”的数据。4.1.3示例假设我们有一个包含敏感信息的表customer_details,我们希望标记它,并限制访问。--创建一个包含敏感信息的表
CREATETABLEcustomer_details(
customer_idINT,
nameVARCHAR,
emailVARCHAR,
credit_card_numberVARCHAR
);
--添加描述性标签
ALTERTABLEcustomer_detailsSETTAG='sensitive_data';
ALTERTABLEcustomer_detailsSETTAG='customer_info';
--创建一个角色,限制对敏感数据的访问
CREATEROLEsensitive_data_role;
GRANTUSAGEONSCHEMApublicTOROLEsensitive_data_role;
GRANTSELECTONTABLEcustomer_detailsTOROLEsensitive_data_role;4.2数据生命周期管理数据生命周期管理(DataLifecycleManagement,DLM)是指数据从创建到销毁的整个过程中的管理策略,包括数据的存储、备份、归档和删除。4.2.1原理在Snowflake中,数据生命周期管理主要通过时间旅行功能、归档和删除策略来实现。时间旅行功能允许用户恢复到过去某个时间点的数据,而归档和删除策略则帮助管理数据的存储和清理。4.2.2内容时间旅行:Snowflake的时间旅行功能允许用户查询过去7天到90天的数据,具体时间取决于表的设置。归档策略:可以将不再频繁访问的数据归档到成本更低的存储层,如Snowflake的归档层。删除策略:定义数据的保留期限,超过期限的数据将被自动删除。4.2.3示例假设我们有一个销售数据表sales,我们希望设置数据的保留期限为30天,并将超过30天的数据归档。--创建一个销售数据表
CREATETABLEsales(
sale_idINT,
sale_dateDATE,
amountDECIMAL(10,2)
);
--设置时间旅行保留期为30天
ALTERTABLEsalesSETRETENTION_TIME=30;
--创建一个归档表
CREATETABLEsales_archiveASSELECT*FROMsalesWHEREsale_date<DATEADD(day,-30,CURRENT_DATE());
--定义一个删除策略
--注意:Snowflake不直接支持自动删除数据,但可以通过定期运行SQL查询或使用数据共享功能来间接实现4.3Snowflake的审计与监控功能审计与监控是数据治理中不可或缺的部分,它帮助组织监控数据的使用情况,确保合规性和安全性。4.3.1原理Snowflake提供了详细的审计日志,记录了所有数据库活动,包括查询、数据更改、权限更改等。此外,Snowflake还支持实时监控,可以立即响应异常活动。4.3.2内容审计日志:Snowflake的审计日志记录了所有数据库活动,可以用于合规性审计和安全审查。实时监控:通过设置警报和通知,可以实时监控数据库活动,及时发现并响应异常。4.3.3示例假设我们需要监控所有对customer_details表的查询,并在查询次数超过一定阈值时发送警报。--启用审计日志
ALTERSYSTEMSETAUDIT_LOG_RETENTION_DAYS=90;
--创建一个审计表,记录对customer_details表的查询
CREATETABLEaudit_customer_details(
query_idVARCHAR,
query_textVARCHAR,
query_start_timeTIMESTAMP_NTZ,
query_end_timeTIMESTAMP_NTZ,
bytes_scannedNUMBER,
rows_producedNUMBER
);
--定义一个过程,定期将审计日志中的信息加载到审计表中
CREATEORREPLACEPROCEDUREload_audit_data()
RETURNSVARCHAR
LANGUAGESQL
AS
$$
BEGIN
INSERTINTOaudit_customer_details
SELECTquery_id,query_text,query_start_time,query_end_time,bytes_scanned,rows_produced
FROMtable(information_schema.query_history())
WHEREquery_textLIKE'%customer_details%';
RETURN'Auditdataloadedsuccessfully.';
END;
$$;
--调用过程
CALLload_audit_data();
--定义警报,当查询次数超过100时发送通知
--注意:Snowflake的警报和通知功能需要通过外部工具或服务实现,如使用SnowflakeStream或与第三方监控工具集成通过上述示例,我们可以看到如何在Snowflake中实施数据分类与标签、数据生命周期管理和审计与监控功能,以加强数据治理。这些实践不仅提高了数据的安全性和合规性,还优化了数据的存储和使用效率。5数据仓库优化与性能提升5.1查询优化技巧5.1.1索引使用在Snowflake中,虽然它自动管理索引,但在设计查询时,理解数据分布和选择性仍然重要。例如,对于经常用于过滤的列,确保数据分布均匀,可以提高查询性能。5.1.2选择性原则选择性高的查询(即返回较少行的查询)通常比选择性低的查询(返回大量行)更快。例如,使用WHERE子句来限制返回的行数。5.1.3代码示例--查询示例:从销售数据中选择特定地区的销售记录
SELECT*
FROMsales
WHEREregion='NorthAmerica';此查询通过限制返回的行数到特定地区,提高了查询的选择性,从而可能提升性能。5.1.4分区表利用Snowflake的分区功能,可以将大表分割成更小、更易于管理的部分。这有助于减少扫描的数据量,从而提高查询速度。5.1.5代码示例--创建分区表示例
CREATETABLEsales(
idINT,
dateDATE,
amountDECIMAL(10,2),
regionVARCHAR
)
PARTITIONBY(date);通过按日期分区,可以更高效地查询特定时间段的数据。5.2数据加载与ETL流程5.2.1数据加载最佳实践在将数据加载到Snowflake时,使用COPYINTO命令可以显著提高效率。此命令支持从多种数据源加载数据,包括本地文件、S3、AzureBlobStorage等。5.2.2代码示例--使用COPYINTO从S3加载数据
COPYINTOsales
FROM@my_s3_stage/sales_data.csv
CREDENTIALS=(aws_key_id='YOUR_AWS_KEY_ID',aws_secret_key='YOUR_AWS_SECRET_KEY')
FILE_FORMAT=(type='CSV',FIELD_DELIMITER=',',SKIP_HEADER=1);此示例展示了如何从S3存储桶加载CSV数据到sales表中。5.2.3ETL流程优化ETL(Extract,Transform,Load)流程在数据仓库中至关重要。在Snowflake中,可以利用其强大的SQL功能和UDF(用户定义函数)来在数据加载过程中进行数据转换,减少数据处理的延迟。5.2.4代码示例--使用UDF进行数据转换
CREATEORREPLACEFUNCTIONconvert_currency(amountDECIMAL(10,2),currencyVARCHAR)
RETURNSDECIMAL(10,2)
AS$$
CASEcurrency
WHEN'EUR'THENamount*1.18
WHEN'GBP'THENamount*1.38
ELSEamount
END
$$LANGUAGESQL;
--在数据加载时应用UDF
COPYINTOsales
FROM@my_s3_stage/sales_data.csv
CREDENTIALS=(aws_key_id='YOUR_AWS_KEY_ID',aws_secret_key='YOUR_AWS_SECRET_KEY')
FILE_FORMAT=(type='CSV',FIELD_DELIMITER=',',SKIP_HEADER=1)
ON_ERROR='ABORT_STATEMENT'
PREPROCESSOR=(convert_currency(amount,currency));此示例创建了一个UDF来转换货币,并在数据加载时应用此函数,确保数据在加载时即被正确转换。5.3性能调优与成本控制5.3.1性能调优Snowflake的性能调优主要涉及查询优化、合理使用资源池和工作单元(WUs)。通过调整这些参数,可以确保查询在最短的时间内完成,同时保持成本效益。5.3.2资源池和工作单元Snowflake允许用户创建资源池来管理计算资源。合理分配资源池和调整工作单元的数量,可以优化查询性能,同时控制成本。5.3.3代码示例--创建资源池
CREATERESOURCEPOOLmy_resource_pool
MIN_SIZE=1
MAX_SIZE=5
MIN_CLUSTER_SIZE='X-Small'
MAX_CLUSTER_SIZE='Large';
--使用资源池执行查询
ALTERSESSIONSETresource_pool=my_resource_pool;
SELECT*FROMsalesWHEREdateBETWEEN'2020-01-01'AND'2020-12-31';通过创建资源池并设置最小和最大大小,可以确保查询在资源充足的情况下运行,同时避免过度使用资源导致成本增加。5.3.4成本控制Snowflake的按需付费模式意味着优化查询和资源使用可以显著降低运行成本。使用EXPLAIN命令来分析查询计划,可以帮助识别和优化成本较高的操作。5.3.5代码示例--使用EXPLAIN分析查询计划
EXPLAINPLANFOR
SELECT*FROMsalesWHEREdateBETWEEN'2020-01-01'AND'2020-12-31';
--查看EXPLAIN结果
SELECT*FROMtable(information_schema.query_history())WHEREquery_textLIKE'%EXPLAIN%';通过分析查询计划,可以识别出哪些操作可能消耗更多资源,从而进行优化,以减少成本。以上示例和技巧展示了如何在Snowflake中优化数据仓库的性能和成本。通过合理设计查询、优化数据加载过程和精细管理资源,可以确保数据仓库的高效运行,同时控制成本。6高级Snowflake功能与应用6.1Snowflake的流数据处理流数据处理是Snowflake的一项强大功能,它允许实时数据摄取和分析,这对于需要即时洞察的业务场景至关重要。Snowflake通过Stage和Pipe的概念,支持从外部数据源(如AmazonS3、AzureBlobStorage等)自动加载数据到数据仓库。6.1.1原理Snowflake的流数据处理基于事件驱动架构,使用Pipe来监听Stage上的数据变化。当新的数据文件到达Stage时,Pipe会自动触发,将数据加载到指定的表中。这一过程无需人工干预,实现了数据的自动化和实时处理。6.1.2实践以下是一个使用Snowflake进行流数据处理的示例:--创建Stage
CREATEORREPLACESTAGEmy_stage
URL='s3://my-bucket/'
CREDENTIALS=(AWS_KEY_ID='my_key_id'AWS_SECRET_KEY='my_secret_key');
--创建Pipe,监听Stage上的数据变化
CREATEORREPLACEPIPEmy_pipe
AUTO_INGEST=TRUE
AS
COPYINTOmy_tableFROM(SELECT$1,$2FROM@my_stage/my_folder)
FILE_FORMAT=(FORMAT_NAME='my_csv_format');在这个例子中,我们首先创建了一个名为my_stage的Stage,它指向AmazonS3上的一个存储桶。然后,我们创建了一个名为my_pipe的Pipe,它自动监听my_stage上的数据变化,并将数据加载到my_table中。my_csv_format是一个预定义的CSV文件格式,用于解析数据文件。6.2跨云数据仓库的实现Snowflake的跨云数据仓库能力,使得在不同云平台(如AWS、Azure和GCP)之间共享数据成为可能,无需数据复制或迁移,这极大地提高了数据的可访问性和安全性。6.2.1原理Snowflake通过其独特的架构设计,支持跨云数据共享。它使用外部Stage和SecureDataSharing功能,允许不同云环境中的数据仓库访问同一数据集,同时保持数据的安全性和合规性。6.2.2实践以下是一个跨云数据仓库的实现示例:--在AWS环境中创建Stage
CREATEORREPLACESTAGEaws_stage
URL='s3://my-aws-bucket/'
CREDENTIALS=(AWS_KEY_ID='my_aws_key_id'AWS_SECRET_KEY='my_aws_secret_key');
--在Azure环境中创建Stage
CREATEORREPLACESTAGEazure_stage
URL='azure://my-azure-container/'
CREDENTIALS=(AZURE_SAS_TOKEN='my_azure_sas_token');
--创建SecureDataSharing
CREATEORREPLACESHAREmy_share;
GRANTUSAGEONSCHEMAmy_schemaTOSHAREmy_share;
GRANTSELECT
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年度建筑施工包工包料合同(钢结构工程)
- 2024年度高校就业创业政策宣传与推广合同
- 2024年度质押合同协议
- 2024年度教育培训合同标的2篇
- 13“声音的产生”说课稿-2024-2025学年科学四年级上册人教鄂教版
- 二零二四年度夫妻财产分割合同模板3篇
- 2024年广告发布合同2篇
- 黑龙江省齐齐哈尔市第十一中学2024年高三一诊练习三数学试题
- 《国际金融前言》课件
- 14《杠杆》说课稿-2023-2024学年青岛版五四制科学五年级下册
- 现代的全面预算管理.ppt
- 道路交通安全法律法规(PPT 90页)
- (完整word版)气缸结构设计
- 土木工程常用术语英文
- MSDS(T-09)快干水2x3
- 《常用正颌外科手术》ppt课件
- 王虎应老师股市预测分析精彩卦例
- 金融租赁公司联合租赁合作规范
- (完整版)数独题目100题
- 【原创】仁爱英语 七年级上册情景交际+看图写话(有答案)
- 危重新生儿的病情观察及护理要点
评论
0/150
提交评论