You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

数据库模型优化:品牌与自定义品牌表查询方案优化咨询

优化方案:数据库模型与查询语句

一、优化后的数据库模型

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 13:14:58