数据的规范设计和反规范优化实例
1 简介
现在企业需要新建线上销售系统,为用户提供便捷的互联网商品销售服务。
该系统除了常规商品展示、订单、用户交流与反馈功能外,
还需要提供当前热销产品排名、评价分类管理等功能,以下为规范化设计后部分数据库的表:
供应商(供应商ID,供应商名称,联系方式,供应商地址);
商品(商品ID,商品名称,商品型号,商品价格,供应商ID)
商品库存(商品ID,当前库存数量);
订单(订单号码,商品ID,供应商ID,商品数量,订单金额)
要优化该表设计的步骤如下:首先修改为 3NF规范,然后再优化查询性能。
2 首先满足3NF
分析以下为规范化设计后部分数据库的表,如何更改他们以满足3NF规范要求?
为了使这些表符合第三范式(3NF)的规范,我们需要消除冗余和依赖性问题。
3NF 要求每个非主属性对键必须完全依赖,并且不存在传递依赖。以下是逐一分析和修改的建议:
-
- 供应商表
原表:
供应商(供应商ID,供应商名称,联系方式,供应商地址)
这张表符合3NF的要求,因为它的所有非主属性(供应商名称、联系方式、供应商地址)都完全依赖于主键(供应商ID),没有部分依赖或传递依赖。
-
- 商品表
原表:
商品(商品ID,商品名称,商品型号,商品价格,供应商ID)
- 商品表
分析与修改:
这张表唯一问题可能是 供应商ID 出现的冗余。
假如一个商品只能有一个供应商,那可以保持不变。如果一个商品可以由多个供应商提供,我们可能需要建立一个 商品供应商 表来管理多对多关系。
修改后:
商品(商品ID, 商品名称, 商品型号, 商品价格)
商品供应商(商品ID, 供应商ID)
这将使商品与供应商的关系保持在单独的表中。
-
- 商品库存表
原表:
商品库存(商品ID,当前库存数量)
- 商品库存表
这张表没有违反3NF的要求,因为库存数量是唯一依赖于 商品ID 的数据。符合3NF。
-
- 订单表
原表:
订单(订单号码,商品ID,供应商ID,商品数量,订单金额)
- 订单表
该表的供应商ID 可以通过 商品ID 获取到,因此 供应商ID 在此表中属于冗余数据,违反了3NF中的传递依赖规则。
修改后:
订单(订单号码, 商品ID, 商品数量, 订单金额)
删除 供应商ID,通过商品表与供应商表的关系查询供应商信息。
通过上述调整,我们去除了冗余数据,消除了传递依赖,使数据库符合第三范式的要求,保证了数据的完整性和一致性。
3 增加查询性能
根据反规范化设计中选择的 冗余列 方法,下面是针对每个表的 MySQL 表创建语句。我们会将供应商的部分常用信息冗余存储在商品表中,避免频繁的表连接查询。
-
-
供应商表(suppliers)
CREATE TABLE suppliers ( supplier_id INT AUTO_INCREMENT PRIMARY KEY, supplier_name VARCHAR(255) NOT NULL, contact_info VARCHAR(255), supplier_address VARCHAR(255) );
-
supplier_id 是主键,用于唯一标识供应商。
supplier_name 是供应商名称。
contact_info 用于存储供应商的联系方式。
supplier_address 用于存储供应商的地址。
-
- 商品表(products)
这里我们在商品表中冗余了部分供应商信息,如 supplier_name 和 supplier_address。
CREATE TABLE products (
product_id INT AUTO_INCREMENT PRIMARY KEY,
product_name VARCHAR(255) NOT NULL,
product_model VARCHAR(100),
product_price DECIMAL(10, 2) NOT NULL,
supplier_id INT,
supplier_name VARCHAR(255), -- 冗余列
supplier_address VARCHAR(255), -- 冗余列
FOREIGN KEY (supplier_id) REFERENCES suppliers(supplier_id)
);
supplier_name 和 supplier_address 是冗余列,直接存储供应商的常用信息,避免频繁的表连接查询。
-
-
商品库存表(product_inventory)
CREATE TABLE product_inventory ( product_id INT PRIMARY KEY, current_stock INT NOT NULL, FOREIGN KEY (product_id) REFERENCES products(product_id) );
-
product_id 是主键,且作为外键引用 products 表中的 product_id。
current_stock 用于存储当前库存数量。
-
-
订单表(orders)
CREATE TABLE orders ( order_id INT AUTO_INCREMENT PRIMARY KEY, product_id INT NOT NULL, quantity INT NOT NULL, total_amount DECIMAL(10, 2) NOT NULL, FOREIGN KEY (product_id) REFERENCES products(product_id) );
-
product_id 是外键,引用 products 表中的 product_id。
quantity 是商品的订单数量。
total_amount 是该订单的总金额。
4 总结:
在 products 表中添加了冗余的供应商信息(supplier_name 和 supplier_address),这样用户在查询商品信息时,不需要连接 suppliers 表即可获得商品及其供应商的常用信息。
其他表结构保持相对简单,遵循基本的设计原则。
通过这种设计步骤,先满足3NF设计规范后,又减少了复杂查询中多表连接的次数,提高了用户查询商品信息的效率。~~~~
- 点赞
- 收藏
- 关注作者
评论(0)