购物网站多语言架构
一种语言一个数据库
这样的好处有哪些呢?
1.避免单库数据量过大,导致查询难以优化。
举个例子:假设有2种语言,中文和英文。在商品表中,一个商品在不同语言下,其实还是同一件商品,他们有共同的属性,共同的价格,共同的库存等等;如果放在一个库中那么本来商品数据有100W,现在直接变成了200W。so优化起来是不是更麻烦了呢。而且对于像商品这种表,更新操作是非常频繁的,这样就要不断的去维护索引,这其中开销也是蛮大的。
为什么不用分表?
假如一种语言一个表,那跟分库道理不就一样了吗?
其实我个人觉得分表有很多不足的地方。
如果采用一个语言一张表,那么我们表的数据过大怎么办呢?这时候是不是还要继续分表呢?就目前的状况来看,很多公司都会采用分表去解决。也就是说要分2次表,这样不是很麻烦吗,而且表在同一个数据库中,数据量变大的时候怎么办呢,当达到Mysql储存上限(这里指的是mysql存储到一定数据时候就变得难以优化的情况)不就更麻烦吗?
所以我们采用了分库策略。
表如何设计
需要中英文对于的表,放到对于的库中即可,无需把所有的表都copy
举个例子
商品表:
idtitlestock status
修改PHP框架的数据库操作方法。
我们采用的是THINKPHP。 这里说下如何修改tp 的 add .
tp的add方法是声明在Model下。所以我们新建一个commonModel来继承他的Model类
首先要在配置文件中配置好多个数据库dsn
eg : 'DB_LIST' => array('DN_CN' => 'mysql:XXXX',
'DN_EN' => 'mysql:XXXX'
);
配置公共数据库的表
eg 'LANG_TABLE' => array(
'goods' => array('stock,status'), //这里配置的是该表需要更新的字段;比如商品的库存和状态肯定都是一致的
以下是伪代码
protected $dbName;
//数据库名
protected $tableName;
//表名
protected $data;
// ORM创建的数据对象
protecteds $option;
//查询条件等
function __construct(){}function add($data,$option,$replace){
if(!$data)
$data = https://www.it610.com/article/$this->data;
//如果是create的话,那么add一次之后,$this->data 会被清空parent::add($data,$option,$replace);
//往当前库插入数据
//切换数据库
$this->dbName = 'XXXX';
//这里我们的库都在同一台服务器上,所以不用重新连接
//如果在不用数据库,那么就读取DB_LIST配置来重新连接数据库。$this->db($id,$dsn);
这样切换了数据库
parent::add($data,$option,$replace);
//切换回当前数据库
$this->dbName = 'xxx';
}
删除也是同理
更新数据
一个表中肯定会有一些字段是不用做多语言的,但是必须保证不用语言下的数据是一致的。比如商品价格,商品库存等
这个时候更新了一条记录,也要去同步下其他库的数据
【购物网站多语言架构】正如上面配置。 我们只需要把需要同步的字段配置好就行了
function save($data,$option)
{
parent::save($data,$option);
//切换数据库
//对比$data 的key也配置的字段,取交集 $field
parent::save($field,$option);
//如果是create的数据,记得对data进行赋值
}
推荐阅读
- 放屁有这三个特征的,请注意啦!这说明你的身体毒素太多
- 爱就是希望你好好活着
- 昨夜小楼听风
- 知识
- 死结。
- 我从来不做坏事
- 烦恼和幸福
- 关于QueryWrapper|关于QueryWrapper,实现MybatisPlus多表关联查询方式
- 【生信技能树】R语言练习题|【生信技能树】R语言练习题 - 中级
- 一起来学习C语言的字符串转换函数