从理论到实战:数据库设计,何时该打破经典的“三范式”?

01 引言

作为一名开发,数据库表的设计肯定都遇到过。数据设计的三范式是数据库规范化理论中的核心概念,你是否遵守了,又为什么打破范式?还是说野生程序员,无所谓范式的遵守。

02 三范式概述

所谓范式,就是在漫长的开发设计过程中,总结出来的规范,能够很大程度上规避一些问题。

2.1 第一范式

第一范式(1NF):原子性。规范表中的每一列都是不可再分的最小数据单元,即每个字段都是原子的。

反例

-- 不符合1NF的设计
CREATE TABLE tb_user (
    id INT PRIMARY KEY,
    name VARCHAR(50),
    contact VARCHAR(100) -- 包含电话和邮箱:'13800138000,test@email.com'
);

这里的contact字段包含了电话和邮箱信息,破坏了字段的原子性。当然一般人也不会这么设计,大家也都知道每一个字段都代表独立的含义,不会去聚合字段。但是这种骨子里都会这样设计的方式,被人总结为第一范式。

正例

-- 符合1NF的设计
CREATE TABLE tb_user (
    id INT PRIMARY KEY,
    name VARCHAR(50),
    phone VARCHAR(20),
    email VARCHAR(50)
);

2.2 第二范式

第二范式(2NF):消除部分依赖。在满足1NF的基础上,非主键列必须完全依赖于整个主键(针对复合主键)。

这个比较好理解,这就是针对符合主键的。要么依赖整个复合主键要么不依赖,坚决不能只依赖复合主键的一部分。

反例

-- 不符合2NF的设计(用户角色表)
CREATE TABLE tb_user_role (
    user_id INT,
    role_id INT,
    role_name VARCHAR(100), -- 仅依赖于role_id,而非整个主键
    create_time datetime
    PRIMARY KEY (user_id, role_id)
);

role_name字段仅仅依赖于role_id,而非user_idrole_id联合主键。所以字段应该放到其他表中。

正例

-- 符合2NF的拆分
CREATE TABLE tb_user (
    id INT PRIMARY KEY,
    user_name VARCHAR(50),
    phone VARCHAR(20),
    email VARCHAR(50)
);

CREATE TABLE tb_role (
    id INT PRIMARY KEY,
    role_name VARCHAR(50)
);

CREATE TABLE tb_user_role (
    user_id INT,
    role_id INT,
    create_time datetime
    PRIMARY KEY (user_id, role_id)
);

2.3 第三方范式

第三方范式(3NF):消除传递依赖。在满足2NF的基础上,非主键列之间不能存在传递依赖。

第三方范式和第二范式非常相似,按照小编的理解完成可以用冗余字段来说明,也就是不允许表中有冗余字段。

反例

-- 不符合3NF的设计
CREATE TABLE tb_employee (
    employee_id INT PRIMARY KEY,
    employee_name VARCHAR(50),
    department_id INT,
    department_name VARCHAR(50), -- 依赖于department_id,而非直接依赖于employee_id
    department_location VARCHAR(100)
);

员工表中已经存在了部门ID(department_id),而department_name是依赖department_id,是不属于员工信息的。必须要消除这种传递的依赖。

正例

-- 符合3NF的拆分
CREATE TABLE tb_employees (
    employee_id INT PRIMARY KEY,
    employee_name VARCHAR(50),
    department_id INT
);

CREATE TABLE tb_departments (
    department_id INT PRIMARY KEY,
    department_name VARCHAR(50),
    location VARCHAR(100)
);

2.4 思考

1NF是为了解决字段混乱,无法准确描述字段含义的问题,给查询带来困难。2NF3NF是为了解决字段冗余问题,保证每次查询的信息没有异议。

但是我们实际开发中会严格遵守这写范式么?不一定,我们通常都是根据业务场景设计数据库表,以满足业务逻辑。常常进行反范式的设计。

03 反范式设计

反范式设计的目的只有一个,那就是方便业务处理。

3.1 反第一范式

正常的来讲,第一范式是必须要遵守的。但是,并不是绝对的。

主要的业务字段完全遵守原子性的设计,然而对于辅助字段来说,就没有那么严格了。比如我们数据库设计中要求必须要有一个字段:reamrk VARCHAR(200)

这个字段是为了保存一些额外的,业务之外用于技术人员查看的信息。很有可能存入一些符合信息。

3.2 反第二三范式

二三范式可以按照冗余说明。

业务为了查询方便,比如一个后台页面,业务人员需要按照用户信息、订单、商品信息查询。

如图,查询条件中就包含了5个表的信息

  • 物流信息
  • 用户信息
  • 订单信息
  • 财务信息
  • 车辆信息

如果按照范式设计,需要通过关联表查询即可。但是,随着数据量的增加,查询就会变慢,为了解决慢的问题,我们尽量减少跨表查询,就需要冗余字段。

3.3 反范式设计场景

冗余字段

冗余字段可以减少库表之间的关联。

-- 电商订单系统优化
CREATE TABLE Orders (
    order_id INT PRIMARY KEY,
    customer_id INT,
    customer_name VARCHAR(50), -- 冗余:避免连接Customers表
    total_amount DECIMAL(10,2), -- 冗余:预计算值
    item_count INT, -- 冗余:避免聚合查询
    status VARCHAR(20),
    created_at TIMESTAMP
);

宽表设计

大数据时代,为了分析数据,我们需要建宽表,宽表中会冗余大量的字段,以报表见多。

-- 销售报表宽表(星型模型)
CREATE TABLE Sales_Fact (
    sale_id INT PRIMARY KEY,
    sale_date DATE,
    product_id INT,
    product_name VARCHAR(100), -- 维度冗余
    category_name VARCHAR(50),
    customer_id INT,
    customer_region VARCHAR(50), -- 维度冗余
    salesperson_id INT,
    salesperson_name VARCHAR(50), -- 维度冗余
    unit_price DECIMAL(10,2),
    total_amount DECIMAL(10,2),
    discount_amount DECIMAL(10,2),
    net_amount DECIMAL(10,2),
    INDEX idx_date (sale_date),
    INDEX idx_product (product_id),
    INDEX idx_customer (customer_id)
) ENGINE=InnoDB;

T+1报表

为了业务需要,我们需要统计时间段内的销售数据,为了避免实时查询带来的性能损耗,我们经常会设计T+1的报表。T+1的报表会忽略业务表字段的传递,大量冗余需要的字段,已完成展示的需要。

04 小结

三范式是数据库设计的理论基础,保证了数据的一致性和完整性。反范式设计是实践中的优化手段,通过牺牲部分规范化来提升查询性能。无论何种设计思想,目的只有一个,那就是为业务服务。

内容概要:本文出自罗兰贝格关于工业4.0现状的报告,系统分析了制造业在数字化转型过程中的实际进展与挑战。报告指出,尽管“工业4.0”概念提出已逾十年,但多数企业仍未实现预期的智能化、自组织生产目标,主要受限于技术复杂性、组织孤岛、投资回报周期长及人才短缺等问题。通过对领先制造企业的研究,报告提炼出三大成功要素:一是制定基于现实的工业4.0愿景与全面战略,明确用例优先级;二是建立“中心辐射式”组织架构,设立专职数字化制造部门,推动跨职能协作与规模化落地;三是构建统一的IT/OT目标架构,强化数据生态与系统互操作性。报告特别强调,高价值用例如预测性维护、实时参数优化、视觉检测等已在汽车与半导体行业显现显著成效,企业应聚焦可量化回报的场景,结合资源现实,分阶段推进转型。; 适合人群:制造业企业管理者、数字化转型负责人、工业互联网从业者及政策制定者; 使用场景及目标:①帮助企业评估自身工业4.0成熟度并制定务实发展战略;②为制造企业设计组织架构与IT/OT技术路线图提供参考;③指导资源优先配置于高价值数字化用例,提升投资回报率; 阅读建议:建议结合企业实际生产场景阅读,重点关注“中心辐射式”运营模式与六大高价值用例的适用性分析,同时参考报告中的汽车行业案例,因地制宜地规划数字化路径。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

智_永无止境

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值