如何使用SQL视图将非规范化的宽表数据映射为规范化的逻辑模型?

千丽吖_3453

千丽吖_3453

2026-07-11

803人浏览

原创

视图无法真正解决数据冗余和更新异常,但可为bi、api等提供逻辑3nf接口;错误做法是用left join“假拆分”宽表,正确做法是用distinct+哈希为各实体建独立逻辑维度视图,并在事实视图中直接计算键值。

如何使用sql视图将非规范化的宽表数据映射为规范化的逻辑模型?

直接用视图“假装”规范化,解决不了数据冗余和更新异常;但对BI消费、API输出或下游ETL来说,视图能快速提供逻辑上符合3NF的接口,而无需重构物理表结构。

为什么不能在视图里用 JOIN 拼出“假规范化”模型?

常见错误是写一个视图把宽表字段拆成多张逻辑子表,再用 LEFT JOIN 模拟外键关系——比如从 orders_wide 中 SELECT 出 customer_id、customer_name、product_id、product_name,再 JOIN 回自己“去重”。这会导致:

  • 重复行爆炸:每条原始订单行都带全量客户/商品信息,JOIN 后仍是笛卡尔积式膨胀,不是真正的实体分离
  • NULL 语义混乱:当某字段在宽表中为空,视图无法区分是“暂无值”还是“该实体不存在”
  • BI 工具识别失败:Power BI 或 Tableau 会把这种视图当作普通宽表,无法建立正确的维度关系

正确做法:用 UNION ALL + 标识字段构造逻辑维度视图

核心思路是放弃“一张视图模拟多张表”,改为为每个逻辑实体单独建视图,并用固定字段标明来源与粒度。例如,原始宽表 sales_flat 包含 order_id、cust_name、cust_city、prod_sku、prod_category 等混杂字段:

先建客户逻辑视图:

CREATE VIEW dim_customer AS
SELECT DISTINCT
  MD5(cust_name, cust_city) AS customer_key,
  cust_name AS customer_name,
  cust_city AS city,
  'sales_flat' AS source_system,
  CURRENT_TIMESTAMP AS loaded_at
FROM sales_flat
WHERE cust_name IS NOT NULL;

再建商品逻辑视图:

CREATE VIEW dim_product AS
SELECT DISTINCT
  MD5(prod_sku) AS product_key,
  prod_sku,
  prod_category,
  'sales_flat' AS source_system,
  CURRENT_TIMESTAMP AS loaded_at
FROM sales_flat
WHERE prod_sku IS NOT NULL;

关键点:

顽兔抠图
顽兔抠图

顽兔抠图是一款AI图片处理工具,Alibaba 推出的一键去除商品图背景工具。

下载
  • 必须用 DISTINCT + 确定性哈希(如 MD5())生成稳定主键,避免后续变更导致键漂移
  • 显式添加 source_system 和 loaded_at 字段,让下游知道这是派生逻辑表,非真实源系统
  • WHERE 过滤掉空值,防止 NULL 参与哈希或污染维度唯一性

明细事实视图如何关联这些逻辑维度?

不要在事实视图里写 JOIN dim_customer ON ... —— 那会让视图依赖外部对象,破坏可移植性。应直接在宽表中反查并映射:

CREATE VIEW fact_sales AS
SELECT
  order_id,
  MD5(cust_name, cust_city) AS customer_key,
  MD5(prod_sku) AS product_key,
  sale_amount,
  order_date,
  'sales_flat' AS source_system
FROM sales_flat
WHERE cust_name IS NOT NULL AND prod_sku IS NOT NULL;

这样做的好处:

  • 所有逻辑都在单条 SQL 内完成,不依赖其他视图或函数(除非数据库支持内联标量函数)
  • BI 工具导入时,customer_key 和 product_key 被识别为字符串型维度字段,可直接拖拽建模
  • 若未来物理表结构变化(如新增 cust_region),只需扩展 dim_customer 视图,fact_sales 不受影响

字段类型与 NULL 处理最容易被忽略的细节

宽表里常有混合类型字段(如 status 是 TINYINT 但实际存 0/1/NULL),直接暴露给 BI 会引发筛选失效:

  • 数值型 ID 字段(如 cust_id)若原为 DECIMAL(18,0),BI 可能自动归为“度量”,需在视图中写成 CAST(cust_id AS CHAR)
  • 布尔类字段必须显式转义:CASE WHEN is_active = 1 THEN 'Y' ELSE 'N' END AS is_active_flag,不能留 TINYINT(1)
  • 所有用于 JOIN 的逻辑键字段(如 customer_key)必须定义为 NOT NULL,否则 Power BI 会跳过关系自动检测

真正难的不是写出这些视图,而是让团队接受:它们只是过渡层,不是替代规范化设计的方案。一旦业务稳定、读写比例转向分析侧,就得把逻辑视图沉淀为物理维度表——否则每次查询都在重复计算哈希、去重和类型转换。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

2023.10.12

3843

8

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.27

831

4

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

2024.02.23

1009

5

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

2024.03.06

5661

10

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

2024.03.06

2623

4

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

2024.04.07

5640

11

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

2024.04.29

7421

6

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

2024.04.29

1010

5

sql中删除一列的命令是什么
sql中删除一列的命令是什么

在sql中,使用alter table语句可以删除一列,语法为:alter table table_name drop column column_name。想了解更多sql的相关内容,可以阅读本专题下面的文章。

2024.04.29

892

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.6万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 133.3万人学习