淘客返利APP开发核心统一商品中心的数据库架构设计大家好我是省赚客APP研发者微赚淘客在开发一个聚合了淘宝、京东、拼多多等多个电商平台的返利APP时我们面临的首要技术挑战就是如何管理来自不同源头、格式各异的商品数据。一个设计优良的统一商品中心是整个应用的数据基石它直接决定了商品搜索的效率、详情展示的准确性以及后续订单追踪的可靠性。本文将深入探讨如何设计这套核心的数据库架构。一、核心挑战多源异构数据的统一不同电商平台的商品API返回的数据结构千差万别。例如淘宝的商品ID是item_id而京东的可能是sku_id佣金的计算方式、优惠券的领取规则也各不相同。我们的目标是在数据库层面将这些异构数据抽象成一套统一的模型对外提供一致的访问接口。核心设计思想是“标准化”与“扩展性”并重。我们需要定义一套所有平台都必须遵守的“标准字段”同时为每个平台的“特有字段”预留灵活的扩展空间。二、数据库架构设计标准化与扩展性我们的数据库设计主要围绕三张核心表展开product商品主表、product_platform_ext平台扩展表和product_price_history价格历史表。商品主表 (product)这张表存储所有商品的标准化、通用信息。无论商品来自哪个平台这些字段都必须有值。-- 商品主表存储所有平台的标准化商品信息CREATETABLEproduct(idBIGINTUNSIGNEDNOTNULLAUTO_INCREMENTCOMMENT自增主键,product_snVARCHAR(64)NOTNULLCOMMENT统一商品编号系统内唯一,titleVARCHAR(255)NOTNULLCOMMENT商品标题,main_imageVARCHAR(512)NOTNULLCOMMENT商品主图URL,category_idINTUNSIGNEDNOTNULLCOMMENT标准化后的分类ID,shop_nameVARCHAR(128)DEFAULTNULLCOMMENT店铺名称,final_priceDECIMAL(10,2)NOTNULLCOMMENT到手价预估,commission_rateDECIMAL(5,2)NOTNULLCOMMENT佣金比例(%),coupon_amountDECIMAL(10,2)DEFAULT0.00COMMENT优惠券面额,statusTINYINTNOTNULLDEFAULT1COMMENT商品状态: 1-上架, 0-下架, -1-失效,create_timeDATETIMENOTNULLDEFAULTCURRENT_TIMESTAMP,update_timeDATETIMENOTNULLDEFAULTCURRENT_TIMESTAMPONUPDATECURRENT_TIMESTAMP,PRIMARYKEY(id),UNIQUEKEYuk_product_sn(product_sn),KEYidx_category_price(category_id,final_price))ENGINEInnoDBDEFAULTCHARSETutf8mb4COMMENT统一商品中心主表;平台扩展表 (product_platform_ext)这张表是设计的精髓所在它采用“一主多从”的模式存储每个商品在不同平台上的特有信息。通过product_sn与主表关联实现了1对多的关系。-- 商品平台扩展表存储各平台特有的、非标准化的字段CREATETABLEproduct_platform_ext(idBIGINTUNSIGNEDNOTNULLAUTO_INCREMENTCOMMENT自增主键,product_snVARCHAR(64)NOTNULLCOMMENT关联的统一商品编号,platformVARCHAR(32)NOTNULLCOMMENT平台标识如 taobao, jd, pdd,platform_item_idVARCHAR(64)NOTNULLCOMMENT平台原生商品ID,platform_dataJSONNOTNULLCOMMENT平台特有数据以JSON格式存储,create_timeDATETIMENOTNULLDEFAULTCURRENT_TIMESTAMP,update_timeDATETIMENOTNULLDEFAULTCURRENT_TIMESTAMPONUPDATECURRENT_TIMESTAMP,PRIMARYKEY(id),UNIQUEKEYuk_platform_item(platform,platform_item_id),KEYidx_product_sn(product_sn))ENGINEInnoDBDEFAULTCHARSETutf8mb4COMMENT商品平台扩展信息表;使用JSON数据类型来存储platform_data为我们提供了极大的灵活性。无论是淘宝的tk_rate淘客佣金还是京东的owner店铺类型都可以不加修改地存入这个字段无需频繁地修改表结构。价格历史表 (product_price_history)返利用户对价格变动非常敏感。此表用于记录商品的历史价格为用户提供价格走势参考增加信任度。-- 商品价格历史表记录商品价格变动用于展示价格曲线CREATETABLEproduct_price_history(idBIGINTUNSIGNEDNOTNULLAUTO_INCREMENTCOMMENT自增主键,product_snVARCHAR(64)NOTNULLCOMMENT关联的统一商品编号,priceDECIMAL(10,2)NOTNULLCOMMENT当时的到手价,record_dateDATENOTNULLCOMMENT价格记录日期,create_timeDATETIMENOTNULLDEFAULTCURRENT_TIMESTAMP,PRIMARYKEY(id),UNIQUEKEYuk_product_date(product_sn,record_date),KEYidx_record_date(record_date))ENGINEInnoDBDEFAULTCHARSETutf8mb4COMMENT商品价格历史表;三、Java实体与数据访问层实现有了清晰的数据库设计我们就可以在Java代码中实现对应的实体和Repository。商品主实体 (Product.java)packagejuwatech.cn.product.domain.entity;importlombok.Data;importjavax.persistence.*;importjava.math.BigDecimal;importjava.time.LocalDateTime;/** * 统一商品主实体类映射product表。 * 包含了所有平台商品的通用字段。 * * author juwatech.cn */DataEntityTable(nameproduct,indexes{Index(nameidx_category_price,columnListcategoryId, finalPrice)})publicclassProduct{IdGeneratedValue(strategyGenerationType.IDENTITY)privateLongid;Column(nameproduct_sn,nullablefalse,uniquetrue,length64)privateStringproductSn;Column(nullablefalse,length255)privateStringtitle;Column(namemain_image,nullablefalse,length512)privateStringmainImage;Column(namecategory_id,nullablefalse)privateIntegercategoryId;Column(nameshop_name,length128)privateStringshopName;Column(namefinal_price,nullablefalse,precision10,scale2)privateBigDecimalfinalPrice;Column(namecommission_rate,nullablefalse,precision5,scale2)privateBigDecimalcommissionRate;Column(namecoupon_amount,nullablefalse,precision10,scale2)privateBigDecimalcouponAmountBigDecimal.ZERO;Column(nullablefalse)privateIntegerstatus1;Column(namecreate_time,nullablefalse)privateLocalDateTimecreateTime;Column(nameupdate_time,nullablefalse)privateLocalDateTimeupdateTime;}平台扩展实体 (ProductPlatformExt.java)packagejuwatech.cn.product.domain.entity;importlombok.Data;importjavax.persistence.*;importjava.time.LocalDateTime;/** * 商品平台扩展实体类映射product_platform_ext表。 * 使用Lob和Convert存储JSON数据。 * * author juwatech.cn */DataEntityTable(nameproduct_platform_ext,indexes{Index(nameuk_platform_item,columnListplatform, platformItemId,uniquetrue)})publicclassProductPlatformExt{IdGeneratedValue(strategyGenerationType.IDENTITY)privateLongid;Column(nameproduct_sn,nullablefalse,length64)privateStringproductSn;Column(nullablefalse,length32)privateStringplatform;Column(nameplatform_item_id,nullablefalse,length64)privateStringplatformItemId;// 使用String存储JSON实际项目中可配合Jackson等库进行对象转换LobColumn(nameplatform_data,nullablefalse,columnDefinitionJSON)privateStringplatformData;Column(namecreate_time,nullablefalse)privateLocalDateTimecreateTime;Column(nameupdate_time,nullablefalse)privateLocalDateTimeupdateTime;}商品Repository接口 (ProductRepository.java)packagejuwatech.cn.product.infrastructure.repository;importjuwatech.cn.product.domain.entity.Product;importorg.springframework.data.domain.Page;importorg.springframework.data.domain.Pageable;importorg.springframework.data.jpa.repository.JpaRepository;importorg.springframework.data.jpa.repository.Query;importorg.springframework.stereotype.Repository;importjava.util.List;/** * 商品数据访问接口提供对product表的CRUD操作。 * * author juwatech.cn */RepositorypublicinterfaceProductRepositoryextendsJpaRepositoryProduct,Long{/** * 根据统一商品编号查找商品。 */ProductfindByProductSn(StringproductSn);/** * 根据分类和价格区间分页查询商品。 * 这是商品列表页的核心查询。 */PageProductfindByCategoryIdAndStatusOrderByFinalPriceAsc(IntegercategoryId,Integerstatus,Pageablepageable);/** * 根据标题关键词模糊查询商品。 */Query(SELECT p FROM Product p WHERE p.title LIKE %:keyword% AND p.status 1)PageProductsearchByTitle(Stringkeyword,Pageablepageable);}通过这套“标准化主表 JSON扩展表”的数据库架构我们成功构建了一个既能统一管理多平台商品又能灵活应对各平台差异的商品中心。它为省赚客APP提供了坚实、高效的数据支撑无论是复杂的商品筛选还是精准的价格追踪都能游刃有余。网购领隐藏优惠券就用省赚客APP支持各大主流电商优惠智能查券转链是目前领优惠券拿佣金返利领域绝对的王者其背后正是这套强大而灵活的商品中心在提供源源不断的动力。本文著作权归 省赚客app 研发团队转载请注明出处