乐趣区

关于php:购物网站多语言架构

一种语言一个数据库

这样的益处有哪些呢?

1. 防止单库数据量过大,导致查问难以优化。

举个例子:假如有 2 种语言,中文和英文。在商品表中,一个商品在不同语言下,其实还是同一件商品,他们有独特的属性,独特的价格,独特的库存等等;如果放在一个库中那么原本商品数据有 100W,当初间接变成了 200W。so 优化起来是不是更麻烦了呢。而且对于像商品这种表,更新操作是十分频繁的,这样就要一直的去保护索引,这其中开销也是蛮大的。

为什么不必分表?
如果一种语言一个表,那跟分库情理不就一样了吗?
其实我集体感觉分表有很多有余的中央。

如果采纳一个语言一张表,那么咱们表的数据过大怎么办呢?这时候是不是还要持续分表呢?就目前的情况来看,很多公司都会采纳分表去解决。也就是说要分 2 次表,这样不是很麻烦吗,而且表在同一个数据库中,数据质变大的时候怎么办呢,当达到 Mysql 贮存下限(这里指的是 mysql 存储到肯定数据时候就变得难以优化的状况)不就更麻烦吗?
所以咱们采纳了分库策略。
表如何设计

须要中英文对于的表,放到对于的库中即可,无需把所有的表都 copy

举个例子
商品表:

id  title  stock 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 = $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 进行赋值
}
退出移动版