数据仓库命名规范旨在确保数据仓库中的各种对象(如数据库、表、列、索引、视图等)具有一致、清晰且有意义的名称。这些规范有助于提高数据的可读性、可维护性和可理解性。以下是一些常见的数据仓库命名规范,涵盖了数据库对象的各个方面。
一般命名规则
1. 清晰和有意义
名称应该清晰明了,能够反映其实际用途或内容。
-- 不好的命名
SELECT * FROM tbl1;-- 好的命名
SELECT * FROM customer_orders;
2. 避免使用保留字
避免使用SQL或其他数据库系统的保留字作为名称。
-- 不好的命名
SELECT * FROM user;-- 好的命名
SELECT * FROM customer;
3. 使用小写字母
使用小写字母,避免使用大写或混合大小写,以提高一致性。
-- 不好的命名
SELECT * FROM CustomerData;-- 好的命名
SELECT * FROM customer_data;
4. 单词间使用下划线分隔
使用下划线(_)分隔单词,提高名称的可读性。
-- 不好的命名
SELECT * FROM customerdetails;-- 好的命名
SELECT * FROM customer_details;
数据库对象命名
1. 数据库
数据库名称应反映其用途或所属的业务领域。
-- 示例
CREATE DATABASE sales_data;
2. 表
表名应为复数形式,反映表中存储的数据类型。
-- 示例
CREATE TABLE employees (employee_id INT PRIMARY KEY,first_name VARCHAR(50),last_name VARCHAR(50),email VARCHAR(100)
);
3. 列
列名应为单数形式,反映列中存储的数据内容。
-- 示例
CREATE TABLE orders (order_id INT PRIMARY KEY,customer_id INT,order_date DATE,total_amount DECIMAL(10, 2)
);
4. 索引
索引名称应包含表名和列名,并以idx
为后缀。
-- 示例
CREATE INDEX idx_orders_customer_id ON orders (customer_id);
5. 视图
视图名称应以vw_
为前缀,反映其数据来源或用途。
-- 示例
CREATE VIEW vw_customer_orders AS
SELECT c.customer_id, c.first_name, c.last_name, o.order_id, o.order_date, o.total_amount
FROM customers c
JOIN orders o ON c.customer_id = o.customer_id;
6. 存储过程和函数
存储过程和函数名称应以sp_
或fn_
为前缀,反映其功能。
-- 示例
CREATE PROCEDURE sp_get_customer_orders (IN customer_id INT)
BEGINSELECT * FROM orders WHERE customer_id = customer_id;
END;CREATE FUNCTION fn_calculate_discount (amount DECIMAL(10, 2), discount_rate DECIMAL(5, 2))
RETURNS DECIMAL(10, 2)
BEGINRETURN amount * (1 - discount_rate);
END;
命名约定示例
-- 数据库
CREATE DATABASE sales_data;-- 表
CREATE TABLE customers (customer_id INT PRIMARY KEY,first_name VARCHAR(50),last_name VARCHAR(50),email VARCHAR(100)
);CREATE TABLE orders (order_id INT PRIMARY KEY,customer_id INT,order_date DATE,total_amount DECIMAL(10, 2)
);-- 索引
CREATE INDEX idx_orders_customer_id ON orders (customer_id);-- 视图
CREATE VIEW vw_customer_orders AS
SELECT c.customer_id, c.first_name, c.last_name, o.order_id, o.order_date, o.total_amount
FROM customers c
JOIN orders o ON c.customer_id = o.customer_id;-- 存储过程
CREATE PROCEDURE sp_get_customer_orders (IN customer_id INT)
BEGINSELECT * FROM orders WHERE customer_id = customer_id;
END;-- 函数
CREATE FUNCTION fn_calculate_discount (amount DECIMAL(10, 2), discount_rate DECIMAL(5, 2))
RETURNS DECIMAL(10, 2)
BEGINRETURN amount * (1 - discount_rate);
END;
数据仓库分层概述
-
原始数据层(Raw Data Layer)
- 保存从源系统提取的原始数据,未经处理或仅经过基本清洗。
- 命名规范:通常以
raw_
或stg_
作为前缀。
-
数据集成层(Data Integration Layer)
- 保存经过清洗、转换和集成的数据,通常用于进一步分析和处理。
- 命名规范:通常以
int_
或etl_
作为前缀。
-
数据汇总层(Data Aggregation Layer)
- 保存聚合和汇总的数据,通常用于生成报表和仪表盘。
- 命名规范:通常以
agg_
或sum_
作为前缀。
-
数据服务层(Data Service Layer)
- 保存最终提供给用户或应用程序的数据,通常以视图或数据集形式存在。
- 命名规范:通常以
svc_
或vw_
作为前缀。
分层命名规范详细介绍
原始数据层(Raw Data Layer)
原始数据层中的表和对象通常使用raw_
或stg_
作为前缀,后面跟随数据源名称和表名。
-- 示例
CREATE TABLE raw_sales_data (sale_id INT,product_id INT,sale_date DATE,quantity INT,price DECIMAL(10, 2)
);CREATE TABLE stg_customer_data (customer_id INT,first_name VARCHAR(50),last_name VARCHAR(50),email VARCHAR(100)
);
数据集成层(Data Integration Layer)
数据集成层中的表和对象通常使用int_
或etl_
作为前缀,后面跟随数据处理阶段和表名。
-- 示例
CREATE TABLE int_sales_data_cleaned (sale_id INT,product_id INT,sale_date DATE,quantity INT,price DECIMAL(10, 2),cleaned_flag BOOLEAN
);CREATE TABLE etl_customer_data_transformed (customer_id INT,first_name VARCHAR(50),last_name VARCHAR(50),email VARCHAR(100),full_name VARCHAR(100)
);
数据汇总层(Data Aggregation Layer)
数据汇总层中的表和对象通常使用agg_
或sum_
作为前缀,后面跟随汇总维度和表名。
-- 示例
CREATE TABLE agg_sales_monthly (month DATE,total_sales DECIMAL(10, 2),total_quantity INT
);CREATE TABLE sum_customer_purchases (customer_id INT,total_purchases DECIMAL(10, 2),total_items INT
);
数据服务层(Data Service Layer)
数据服务层中的视图和对象通常使用svc_
或vw_
作为前缀,后面跟随数据服务对象的名称。
-- 示例
CREATE VIEW svc_sales_summary AS
SELECT sale_date,SUM(quantity) AS total_quantity,SUM(price * quantity) AS total_sales
FROM int_sales_data_cleaned
GROUP BY sale_date;CREATE VIEW vw_customer_summary AS
SELECT customer_id,full_name,email,total_purchases,total_items
FROM sum_customer_purchases
JOIN etl_customer_data_transformed USING (customer_id);
实践中的分层命名示例
假设我们有一个电商平台的数据仓库,包含订单数据和客户数据:
原始数据层
CREATE TABLE raw_orders (order_id INT,customer_id INT,order_date DATE,product_id INT,quantity INT,price DECIMAL(10, 2)
);CREATE TABLE raw_customers (customer_id INT,first_name VARCHAR(50),last_name VARCHAR(50),email VARCHAR(100)
);
数据集成层
CREATE TABLE int_orders_cleaned (order_id INT,customer_id INT,order_date DATE,product_id INT,quantity INT,price DECIMAL(10, 2),cleaned_flag BOOLEAN
);CREATE TABLE int_customers_transformed (customer_id INT,first_name VARCHAR(50),last_name VARCHAR(50),email VARCHAR(100),full_name VARCHAR(100)
);
数据汇总层
CREATE TABLE agg_orders_monthly (month DATE,total_sales DECIMAL(10, 2),total_quantity INT
);CREATE TABLE sum_customers_purchases (customer_id INT,total_purchases DECIMAL(10, 2),total_items INT
);
数据服务层
CREATE VIEW svc_order_summary AS
SELECT order_date,SUM(quantity) AS total_quantity,SUM(price * quantity) AS total_sales
FROM int_orders_cleaned
GROUP BY order_date;CREATE VIEW vw_customer_summary AS
SELECT customer_id,full_name,email,total_purchases,total_items
FROM sum_customers_purchases
JOIN int_customers_transformed USING (customer_id);
通过遵循这些命名规范,可以显著提高数据仓库的可读性和可维护性,使得数据管理和使用更加高效。