Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/235.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Yii多个表的一个关系_Php_Yii - Fatal编程技术网

Php Yii多个表的一个关系

Php Yii多个表的一个关系,php,yii,Php,Yii,我正在尝试编写一个使用多个表的自定义关系,该关系需要使用第一个表中的键连接到其他表 每个表都有相同的列 那么,让故事开始吧: 我正在开发一款基于策略的在线游戏。(PBBG-基于浏览器的持久性游戏) 我有一个大的表(30000.000行),我将该表拆分为100个较小的表(每个表中30000行) 行动发生在村庄内 村庄的详细信息存储在村庄表中 每个村庄都位于一个大陆内,因此有一个k编号,可以告诉我该村庄所属的大陆 村庄表具有以下列: id-p.k。 x-x在地图上的位置 y-y在地图上的位置 k-f

我正在尝试编写一个使用多个表的自定义关系,该关系需要使用第一个表中的键连接到其他表

每个表都有相同的列

那么,让故事开始吧:

我正在开发一款基于策略的在线游戏。(PBBG-基于浏览器的持久性游戏)

我有一个大的表(30000.000行),我将该表拆分为100个较小的表(每个表中30000行)

行动发生在村庄内

村庄的详细信息存储在
村庄
表中

每个村庄都位于一个大陆内,因此有一个
k
编号,可以告诉我该村庄所属的大陆

村庄表具有以下列:

id-p.k。 x-x在地图上的位置 y-y在地图上的位置 k-f.k.大陆id 名称 用户id f.k。 要点

我有100个大洲,这就是为什么我有100个新的小桌子

我也有一个表格,在那里我存储了所有建筑物的详细信息

建筑详细信息存储在
村庄建筑
表中

因此,从原始表
村庄建筑
我现在有
村庄建筑
村庄建筑
,…,
村庄建筑

village\u building\u k…
表格包含以下列:

id-p.k。 乡村标识-f.k。 建筑标识-f.k

现在,我正在尝试编写一个从模型
village
跳到模型
village\u building\u kX
的关系,其中
X
应该在需要时更改

如果我可以使用model
village
中的
k
值,这将为我提供需要加入的表的名称

如果k=2,我需要使用concat从
村庄
跳到
村庄_建筑_k2

public function tableName() {
        return 'village_building_k' . self::$k;
    }

public function relations() {
        return array(
            'relation_village_building' => array(self::HAS_MANY, 'VillageBuildingKXSlaveM', 'village_id'),
        );
    }

$model\u village->relationship\u village\u building->building\u id

您确定需要在框架级别解决此问题吗?我建议在这里使用类似于

的东西,实际上您可以尝试从一些全局参数(例如从会话)传递db名称

public function tableName()
{
   return 'village_building_k' . Yii::app()->session['table'];
}
问题是要为您的玩家长时间保存会话。如果你有很多用户,这将成为一个问题

如果您有几个具有相同结构的表,那么您的数据库体系结构可能是错误的。如果是切分,你需要为此更改AR

yii和sharding中的主要问题是_construct()中的AR调用getMetaData()来获取表模式,所以您需要该级别的表名

在论坛上搜索解决方案,我个人并没有找到关于英语的好文章。下面是一篇关于使用Yii和Redis实现水平切分的文章。俄语节目,但你至少可以看一些代码


30.000.000表也可以,如果您能正确使用它,即使在mysql中也是如此。

我认为您需要添加一些共享数据库。由于你的数据库很大,你不能用你的框架来管理它。只需尝试使用共享数据库来管理数据库。您还可以尝试使用mysql群集来管理数据库和
这可能对你有帮助。请记住,一个框架是一组函数,因此您可以使用代码和支持环境(如数据库等)来操作您的函数。

30 mils,并且由于扩展而不断增加;会涨到50英里。没关系。这个表中没有大数据,所以你可以索引它,它会很快。再看看分区,实际上您所做的是分区,而不是分片。此功能存在于mysql(或您使用的内容)中。只要在你的桌子上为你所有的大陆做100个分区。在1或2个分区范围内进行选择将非常快,但要避免从大量分区中进行选择。创建索引后,测试选择的速度,其中一些会降低您的速度。避免连接、分组、大量或类似运算符的操作,或者更多。此外,您还需要将AR更改为DAO,这样可以更快、更少地消耗内存。如果使用AR-rewrite选择COUNT(*)查询,或为dataProvider设置totalItemCount(例如,使用explain for full table)。避免使用索引进行批量插入/删除。有了这个你应该会没事的,我的数据库已经增长到200 mil了,没关系。我有不同的情况,只是在去年12月测试了select,select的极限值为0.0630,计数~相同。1.2mil结果。是的,mysql中有3亿多行,一切都很好。我会考虑只保留一个表,并在可能的情况下进行大量缓存。