暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

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

会飞的一十六 2024-10-21
495

点击上方【蓝字】关注我们

上一文中我们详细讲解了命名规范中,表命名规范、字段命名规范、任务命名规范、层级命名规范、自定义函数命名规范等,本文我们将详细讲解视图和存储过程命名规范、综合案例分析、常见的陷阱如何避免、命名规范的工具及最佳实践。


01

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

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

(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;


          02

          综合案例分析

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

            -- 创建数据库
            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。


              03

              常见陷阱如何避免

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


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

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

                04

                工具和最佳实践

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

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


                  工具推荐:Confluence, Microsoft Excel, Dataedo


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


                  工具推荐:SQL Prompt, ApexSQL Refactor


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


                  工具推荐:Git, SVN


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


                  工具推荐:Dataedo, SchemaSpy


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


                  工具推荐:GitHub, GitLab, Bitbucket


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


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


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


                  工具推荐:Alation, Collibra


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


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


                  工具推荐:ApexSQL Refactor, Redgate SQL Prompt
                    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")

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


                    猜你喜欢

                    数仓建模:如何构建高效的DWD层?| DWD层最佳实践

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

                    数仓建模:增量更新还是全量更新,该如何选择?


                    公众号:会飞一十六


                    扫码关注 了解更多内容


                    点个 在看 你最好看


                    文章转载自会飞的一十六,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                    评论