电脑门店数据库ER图设计优化及布尔类型字段处理方案
电脑门店数据库ER设计方案解答
1. 计算机与笔记本实体关联方案
不建议仅在Computer实体加布尔字段+可空屏幕尺寸的实现,会产生大量非笔记本记录的空值,不符合数据库设计范式。
推荐采用超类-子类的ER实体设计:
- 保留
Computer父实体,存储所有计算机通用属性:处理器主频、RAM容量、HDD容量、CD驱动器转速(可空,仅搭载CD驱动器的计算机填写)、型号、售价等,满足需求7、8、10的配置/售价差异化要求 - 新增
Laptop子实体,仅存储笔记本独有的屏幕尺寸属性,Laptop的主键同时作为外键关联Computer的主键,二者为一对一关系,仅属于笔记本的计算机才会在Laptop表生成对应记录,完全满足部分计算机为笔记本的需求。
2. 打印机分类实现方案
可以根据后续扩展需求二选一:
- 方案一(轻量适配当前需求):直接在
Printer实体新增非空枚举类型字段print_type,可选值为彩色/黑白,ER图中直接标注该属性即可,数据库层面可以直接用枚举约束或者CHECK约束限制值的范围。 - 方案二(支持后续扩展新类型):新增
PrinterType字典实体,存储类型ID、类型名称两个属性,Printer实体新增外键关联PrinterType的主键,后续新增打印机类型无需修改表结构,仅需要新增字典表记录即可。
3. 制造商实体设计与跨品类查询方案
不需要为不同品类单独创建制造商实体,统一创建Manufacturer实体存储所有制造商的通用信息即可,关联逻辑如下:
- 打印机仅对应一个制造商:在
Printer实体新增非空外键manufacturer_id关联Manufacturer的主键即可满足需求3 - 计算机可对应多个制造商:新增中间关联表
ComputerManufacturerRel,设置computer_id、manufacturer_id两个字段作为联合主键,分别关联Computer和Manufacturer的主键,满足多对多关联的需求4
查询同时生产两类产品的制造商可以用如下SQL实现:
SELECT DISTINCT m.id, m.manufacturer_name FROM Manufacturer m INNER JOIN Printer p ON m.id = p.manufacturer_id WHERE EXISTS ( SELECT 1 FROM ComputerManufacturerRel cm WHERE cm.manufacturer_id = m.id )
内容的提问来源于stack exchange,提问作者NoobCoder
相关产品推荐
相关产品推荐

