Files
akmon/doc_mall/database/seo_optimization_guide.md
2026-01-20 08:04:15 +08:00

7.4 KiB

商城数据库 SEO 优化说明

📊 SEO 优化概述

为了提升 SPA (Single Page Application) 的 SEO 友好性,我们为主要的商城数据表添加了 cid (Content ID) 自增字段,提供更友好的 URL 结构和更好的搜索引擎优化支持。

🎯 涉及的数据表

1. 商品表 (ml_products)

-- 新增字段
cid SERIAL UNIQUE NOT NULL -- SEO友好的自增ID

-- URL 示例
/product/123/iphone-15-pro-256gb
/product/456/nike-air-max-270

2. 商品分类表 (ml_categories)

-- 新增字段
cid SERIAL UNIQUE NOT NULL -- SEO友好的自增ID

-- URL 示例
/category/1/digital-electronics
/category/5/fashion-clothing

3. 品牌表 (ml_brands)

-- 新增字段
cid SERIAL UNIQUE NOT NULL -- SEO友好的自增ID

-- URL 示例
/brand/1/apple
/brand/2/nike

4. 店铺表 (ml_shops)

-- 新增字段
cid SERIAL UNIQUE NOT NULL -- SEO友好的自增ID

-- URL 示例
/shop/1/zhang-digital-store
/shop/2/li-fashion-shop

5. 订单表 (ml_orders)

-- 新增字段
cid SERIAL UNIQUE NOT NULL -- SEO友好的自增ID

-- URL 示例(用户中心)
/order/12345
/order/67890

6. 优惠券模板表 (ml_coupon_templates)

-- 新增字段
cid SERIAL UNIQUE NOT NULL -- SEO友好的自增ID

-- URL 示例
/coupon/1/new-user-discount
/coupon/5/free-shipping

🔍 SEO 优化特性

1. URL 结构优化

  • 短小精悍: 使用数字 ID 替代冗长的 UUID
  • 语义化: 结合 slug 提供有意义的 URL
  • 层次清晰: 明确的路径结构 /type/cid/slug

2. 索引优化

-- 为所有 cid 字段创建索引
CREATE INDEX idx_ml_products_cid ON public.ml_products(cid);
CREATE INDEX idx_ml_categories_cid ON public.ml_categories(cid);
CREATE INDEX idx_ml_brands_cid ON public.ml_brands(cid);
CREATE INDEX idx_ml_shops_cid ON public.ml_shops(cid);
CREATE INDEX idx_ml_orders_cid ON public.ml_orders(cid);
CREATE INDEX idx_ml_coupon_templates_cid ON public.ml_coupon_templates(cid);

3. 视图增强

-- 商品详情视图包含所有相关的 cid
SELECT 
    p.cid as product_cid,
    c.cid as category_cid,
    b.cid as brand_cid,
    s.cid as shop_cid,
    -- 其他字段...
FROM public.ml_products_detail_view;

🛠️ SEO 实用函数

1. 根据 CID 获取数据

-- 获取商品信息
SELECT * FROM public.get_product_by_cid(123);

-- 获取分类信息
SELECT * FROM public.get_category_by_cid(5);

-- 获取品牌信息
SELECT * FROM public.get_brand_by_cid(2);

-- 获取店铺信息
SELECT * FROM public.get_shop_by_cid(1);

2. 生成 SEO 友好 URL

-- 生成商品 URL
SELECT public.generate_seo_url('product', 123, 'iphone-15-pro');
-- 结果: /product/123/iphone-15-pro

-- 生成分类 URL
SELECT public.generate_seo_url('category', 5, 'digital-electronics');
-- 结果: /category/5/digital-electronics

3. 批量更新 Slug

-- 为现有数据生成 slug
SELECT public.update_seo_slugs();

🎨 前端 URL 路由设计

1. Vue Router 配置示例

const routes = [
  // 商品详情页
  {
    path: '/product/:cid/:slug?',
    name: 'ProductDetail',
    component: () => import('@/views/ProductDetail.vue'),
    props: true
  },
  
  // 分类页面
  {
    path: '/category/:cid/:slug?',
    name: 'CategoryPage',
    component: () => import('@/views/CategoryPage.vue'),
    props: true
  },
  
  // 品牌页面
  {
    path: '/brand/:cid/:slug?',
    name: 'BrandPage',
    component: () => import('@/views/BrandPage.vue'),
    props: true
  },
  
  // 店铺页面
  {
    path: '/shop/:cid/:slug?',
    name: 'ShopPage',
    component: () => import('@/views/ShopPage.vue'),
    props: true
  }
];

2. API 调用示例

// 根据 cid 获取商品详情
async getProductDetail(cid) {
  const response = await this.$http.get(`/api/products/cid/${cid}`);
  return response.data;
}

// 根据 cid 获取分类商品列表
async getCategoryProducts(cid, page = 1) {
  const response = await this.$http.get(`/api/categories/${cid}/products`, {
    params: { page, limit: 20 }
  });
  return response.data;
}

📈 SEO 最佳实践

1. URL 规范化

// 确保 URL 包含 slug
function normalizeProductUrl(cid, slug) {
  if (!slug) {
    // 重定向到包含 slug 的完整URL
    const product = await getProductByCid(cid);
    return `/product/${cid}/${product.slug}`;
  }
  return `/product/${cid}/${slug}`;
}

2. Meta 标签优化

// 动态设置页面 meta 信息
function setProductMeta(product) {
  document.title = `${product.name} - ${product.brand_name} | 商城名称`;
  
  const metaDescription = document.querySelector('meta[name="description"]');
  metaDescription.content = product.description.substring(0, 160);
  
  const metaKeywords = document.querySelector('meta[name="keywords"]');
  metaKeywords.content = product.tags.join(', ');
}

3. 结构化数据

// 生成商品的结构化数据
function generateProductSchema(product) {
  return {
    "@context": "https://schema.org/",
    "@type": "Product",
    "name": product.name,
    "description": product.description,
    "image": product.main_image_url,
    "brand": {
      "@type": "Brand",
      "name": product.brand_name
    },
    "offers": {
      "@type": "Offer",
      "price": product.base_price,
      "priceCurrency": "CNY",
      "availability": product.available_stock > 0 ? 
        "https://schema.org/InStock" : "https://schema.org/OutOfStock"
    },
    "aggregateRating": {
      "@type": "AggregateRating",
      "ratingValue": product.rating_avg,
      "reviewCount": product.rating_count
    }
  };
}

🔧 数据库迁移

1. 现有数据处理

如果数据库中已有数据,cid 字段会自动从 1 开始分配:

-- 检查现有数据的 cid 分配情况
SELECT 
    'ml_products' as table_name,
    MIN(cid) as min_cid,
    MAX(cid) as max_cid,
    COUNT(*) as total_records
FROM public.ml_products
UNION ALL
SELECT 
    'ml_categories',
    MIN(cid),
    MAX(cid),
    COUNT(*)
FROM public.ml_categories;

2. 序列重置(如果需要)

-- 重置序列到指定值
SELECT setval('public.ml_products_cid_seq', 10000);
SELECT setval('public.ml_categories_cid_seq', 1000);

📊 性能监控

1. 查询性能

-- 监控 cid 查询的性能
EXPLAIN ANALYZE SELECT * FROM public.ml_products WHERE cid = 123;

-- 检查索引使用情况
SELECT 
    schemaname,
    tablename,
    indexname,
    idx_scan,
    idx_tup_read,
    idx_tup_fetch
FROM pg_stat_user_indexes 
WHERE indexname LIKE '%_cid';

2. 存储空间

-- 查看 cid 字段的存储开销
SELECT 
    table_name,
    column_name,
    data_type,
    is_nullable
FROM information_schema.columns 
WHERE column_name = 'cid' 
  AND table_schema = 'public';

🎯 使用建议

1. 前端开发

  • 优先使用 cid 进行路由和API调用
  • 保留 slug 用于SEO和用户体验
  • 实现URL自动补全功能

2. 后端开发

  • API 接口支持 cid 查询
  • 实现 cidUUID 的快速映射
  • 添加 URL 重定向逻辑

3. SEO 优化

  • 确保所有重要页面都有对应的 cid URL
  • 实现面包屑导航
  • 生成 XML sitemap

4. 数据维护

  • 定期检查 slug 的唯一性
  • 监控 cid 序列的使用情况
  • 备份重要的 SEO 相关数据

通过以上优化,商城系统将获得更好的 SEO 表现和用户体验!