数据库模型优化:品牌与自定义品牌表查询方案优化咨询
优化方案:数据库模型与查询语句
一、优化后的数据库模型
1. 基础公共品牌表
只存储面向所有客户的通用品牌,职责单一:
CREATE TABLE `brand` ( `id` int(10) UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, `default_name` varchar(64) NOT NULL COMMENT '公共品牌默认名称' ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
2. 客户品牌关联表
统一管理客户对公共品牌的自定义名称和客户专属品牌,逻辑更集中:
CREATE TABLE `customer_brand` ( `id` int(10) UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, `customer_id` int(10) UNSIGNED NOT NULL, `brand_id` int(10) UNSIGNED DEFAULT NULL COMMENT '关联公共品牌ID,为NULL时表示客户专属品牌', `custom_name` varchar(64) NOT NULL COMMENT '自定义名称/专属品牌名称', UNIQUE KEY `idx_customer_brand` (`customer_id`, `brand_id`) COMMENT '防止同一客户重复自定义同一公共品牌' ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
模型优势
- 职责分离:避免原模型中
brand表既存公共品牌又存客户专属品牌的混合状态,减少逻辑歧义 - 数据约束:通过唯一键确保同一客户不会重复自定义同一个公共品牌,保障数据一致性
- 扩展性强:后续新增品牌属性只需修改
brand表,客户相关的品牌配置修改customer_brand表即可
二、优化后的查询语句
以获取客户ID=2的所有品牌为例,两种高效写法可选:
写法一:LEFT JOIN + UNION ALL
SELECT COALESCE(cb.brand_id, cb.id) AS id, COALESCE(cb.custom_name, b.default_name) AS name FROM brand b LEFT JOIN customer_brand cb ON b.id = cb.brand_id AND cb.customer_id = 2 UNION ALL SELECT id AS id, custom_name AS name FROM customer_brand WHERE customer_id = 2 AND brand_id IS NULL ORDER BY id ASC;
写法二:NOT EXISTS + UNION ALL
SELECT IFNULL(cb.brand_id, cb.id) AS id, cb.custom_name AS name FROM customer_brand cb WHERE cb.customer_id = 2 UNION ALL SELECT b.id AS id, b.default_name AS name FROM brand b WHERE NOT EXISTS ( SELECT 1 FROM customer_brand cb WHERE cb.customer_id = 2 AND cb.brand_id = b.id ) ORDER BY id ASC;
查询逻辑说明
- 第一部分:获取客户2的所有自定义公共品牌和专属品牌
- 第二部分:获取客户2未自定义的公共品牌,使用默认名称
- 用
UNION ALL替代UNION,避免不必要的去重操作,提升查询效率
三、若保留原模型的查询优化
如果不想调整现有表结构,也可以对原查询做小幅度优化,提升可读性:
SELECT b.id AS id, COALESCE(cb.name, b.name) AS name FROM brand b LEFT JOIN custombrand cb ON b.id = cb.brand_id AND cb.customer_id = 2 WHERE b.customer_id IS NULL OR b.customer_id = 2 ORDER BY id ASC;
注:COALESCE比IFNULL更灵活,支持多个参数;原WHERE条件写法在MySQL中更稳妥,IN (NULL, 2)无法识别NULL值,不建议使用。
内容的提问来源于stack exchange,提问作者haferfleks
相关产品推荐
相关产品推荐

