# 目标
为了解决数据量增加，导致的数据查询缓慢的问题。所以，初步按品牌商作为分表的规则


# 缓存获取
## 缓存获取示意图
![avatar](../images/sharding/sharding_1.png)

## 数据库中分表数据
在 ydd_brand_business 数据库中  ydd_brand 增加 sharding 分表数据. 作为基本的数据
```
 `sharding` text COLLATE utf8mb4_unicode_ci COMMENT '分表表数据'
```

数据格式如下:
```
{"fch_virtual_relation": {'t': 'ydd_fch_virtual_relation_10010001'}}
```
- fch_virtual_relation: 需要分表的表名
- t: 表名key。对应的就是最终要分表名称
- 同时这个json，可以对单个表扩展，二次分表的规则和数据表的数量(待实现)

## 缓存中分表数据
![avatar](../images/sharding/sharding_2.png)

数据类型为 hash 类型。以 brandId 做key

## 注意点
现在的 ydd_brand sharding 数据的获取，一般是接口登录(命令行输入brandId), 会获取品牌商信息(无缓存的情况)。

这种时候，才会获取到 sharding数据，并写入缓存

通过在 数据库Model 层按 brandId 获取对应  sharding 缓存。不会因为数据不存在，再查询一下数据库

因为 90%以上的情况是不分表的业务情况，会浪费事件。所以做了一个权衡

这样，就导致了一个问题。分表数据更新时候，不能实时获取分表数据。需要重新登录，获取直接修改 sharding 缓存

# 缓存获取代码实现
## 获取品牌商信息和设置品牌商上下文
![avatar](../images/sharding/sharding_3.png)
```
// 获取品牌商信息 并设置缓存
$brandSharding = \CommonCacheSdk\BrandShardingCache::getInstance(get_cache_container(CacheDatabaseConstants::SHARDING));
$brandSharding->setBrandShardingCache($brand_id, $brand['sharding'] ? $brand['sharding'] : '');
```

接着就是设置品牌商上下文
```
Context::set(BrandAuth::class, new BrandAuth(['brand_id' => $brandId]));
```
## 品牌商上下文设置地点
- 各个http请求的中间件
- 命令行
- 队列
- 定时任务
- 进程服务


品牌商上下文是为了在 Model 层时，用于获取 sharding 缓存

## Model 层 设置分表
app\Model\Model.php
```
public function __construct(array $attributes = [])
{
    $brandAuth = get_auth_brand();
    if ($brandAuth) {
        $brandId = $brandAuth->brandId();
        $brandShardingIns = \CommonCacheSdk\BrandShardingCache::getInstance(get_cache_container( CacheDatabaseConstants::SHARDING));
        $tableName = $brandShardingIns->getTableName($brandId, $this->table);
        if (!empty($tableName)) {
            $this->setTable($tableName);
        }
    }
    parent::__construct($attributes);
}

// 获取表名
public static function getTableName()
{
    $table = (new static())->getTable();
    return $table;
}
```
`通过对 构造函数的重写，获取按品牌商id和表名获取分表数据，并设置新的分表名称`


# composer 依赖
## BrandShardingCache
需要 composer.json 中添加
```
"repositories": [
    {
        "type": "vcs",
        "url": "http://gitlab.test.2vm.co/ydd-open/common-cache-sdk.git"
    }
],
"require": {
    "ydd-open/common-cache-sdk": "v0.0.1"
}
```