334 lines
7.4 KiB
Markdown
334 lines
7.4 KiB
Markdown
# 商城数据库 SEO 优化说明
|
|
|
|
## 📊 SEO 优化概述
|
|
|
|
为了提升 SPA (Single Page Application) 的 SEO 友好性,我们为主要的商城数据表添加了 `cid` (Content ID) 自增字段,提供更友好的 URL 结构和更好的搜索引擎优化支持。
|
|
|
|
## 🎯 涉及的数据表
|
|
|
|
### 1. 商品表 (`ml_products`)
|
|
```sql
|
|
-- 新增字段
|
|
cid SERIAL UNIQUE NOT NULL -- SEO友好的自增ID
|
|
|
|
-- URL 示例
|
|
/product/123/iphone-15-pro-256gb
|
|
/product/456/nike-air-max-270
|
|
```
|
|
|
|
### 2. 商品分类表 (`ml_categories`)
|
|
```sql
|
|
-- 新增字段
|
|
cid SERIAL UNIQUE NOT NULL -- SEO友好的自增ID
|
|
|
|
-- URL 示例
|
|
/category/1/digital-electronics
|
|
/category/5/fashion-clothing
|
|
```
|
|
|
|
### 3. 品牌表 (`ml_brands`)
|
|
```sql
|
|
-- 新增字段
|
|
cid SERIAL UNIQUE NOT NULL -- SEO友好的自增ID
|
|
|
|
-- URL 示例
|
|
/brand/1/apple
|
|
/brand/2/nike
|
|
```
|
|
|
|
### 4. 店铺表 (`ml_shops`)
|
|
```sql
|
|
-- 新增字段
|
|
cid SERIAL UNIQUE NOT NULL -- SEO友好的自增ID
|
|
|
|
-- URL 示例
|
|
/shop/1/zhang-digital-store
|
|
/shop/2/li-fashion-shop
|
|
```
|
|
|
|
### 5. 订单表 (`ml_orders`)
|
|
```sql
|
|
-- 新增字段
|
|
cid SERIAL UNIQUE NOT NULL -- SEO友好的自增ID
|
|
|
|
-- URL 示例(用户中心)
|
|
/order/12345
|
|
/order/67890
|
|
```
|
|
|
|
### 6. 优惠券模板表 (`ml_coupon_templates`)
|
|
```sql
|
|
-- 新增字段
|
|
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. 索引优化
|
|
```sql
|
|
-- 为所有 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. 视图增强
|
|
```sql
|
|
-- 商品详情视图包含所有相关的 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 获取数据
|
|
```sql
|
|
-- 获取商品信息
|
|
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
|
|
```sql
|
|
-- 生成商品 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
|
|
```sql
|
|
-- 为现有数据生成 slug
|
|
SELECT public.update_seo_slugs();
|
|
```
|
|
|
|
## 🎨 前端 URL 路由设计
|
|
|
|
### 1. Vue Router 配置示例
|
|
```javascript
|
|
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 调用示例
|
|
```javascript
|
|
// 根据 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 规范化
|
|
```javascript
|
|
// 确保 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 标签优化
|
|
```javascript
|
|
// 动态设置页面 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. 结构化数据
|
|
```javascript
|
|
// 生成商品的结构化数据
|
|
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 开始分配:
|
|
|
|
```sql
|
|
-- 检查现有数据的 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. 序列重置(如果需要)
|
|
```sql
|
|
-- 重置序列到指定值
|
|
SELECT setval('public.ml_products_cid_seq', 10000);
|
|
SELECT setval('public.ml_categories_cid_seq', 1000);
|
|
```
|
|
|
|
## 📊 性能监控
|
|
|
|
### 1. 查询性能
|
|
```sql
|
|
-- 监控 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. 存储空间
|
|
```sql
|
|
-- 查看 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` 查询
|
|
- 实现 `cid` 到 `UUID` 的快速映射
|
|
- 添加 URL 重定向逻辑
|
|
|
|
### 3. SEO 优化
|
|
- 确保所有重要页面都有对应的 `cid` URL
|
|
- 实现面包屑导航
|
|
- 生成 XML sitemap
|
|
|
|
### 4. 数据维护
|
|
- 定期检查 slug 的唯一性
|
|
- 监控 cid 序列的使用情况
|
|
- 备份重要的 SEO 相关数据
|
|
|
|
---
|
|
|
|
通过以上优化,商城系统将获得更好的 SEO 表现和用户体验!
|