Yii多个表的一个关系

时间:2014-01-06 18:04:44

标签: php yii

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

每个表都有相同的列。

所以,让故事开始吧:

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

我有一张大表(30.000.000行),我将该表拆分为100个较小的表(每个表中300.000行)。

行动发生在村庄内。

有关村庄的详细信息存储在village表中。

每个村庄都位于一个大陆内,所以有k个号码给我这个村庄所属的大陆。

村名表包含以下栏目:

id - p.k. x - x在地图上的位置 y - y在地图上的位置 k - f.k.大陆身份证 名称 user_id f.k. 点

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

我还有一张桌子,用于存储所有建筑物的详细信息。

建筑物详细信息存储在village_building表格中。

因此,从原始表village_building开始,我现在有village_building_k1village_building_k2,...,village_building_k100

village_building_k...表格包含以下列:

id - p.k. village_id - f.k. building_id - f.k。

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

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

如果k = 2,我需要使用concat从village跳到village_building_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_village->relation_village_building->building_id

3 个答案:

答案 0 :(得分:5)

您确定,您需要在框架级别解决此问题吗?我建议在这里使用像http://en.wikipedia.org/wiki/Shard_(database_architecture)

这样的东西

答案 1 :(得分:3)

我认为您需要添加一些共享数据库。由于您的大型数据库,您无法通过框架进行管理。只需尝试管理数据库的共享数据库。您也可以尝试使用mysql集群来管理数据库Follow this linkthis这可能对您有所帮助。请记住,一个框架是一些功能集,因此您可以使用代码和支持环境(如数据库等)来操作您的函数。

答案 2 :(得分:2)

实际上,您可以尝试从某些全局参数传递db name,例如从session。

public function tableName()
{
   return 'village_building_k' . Yii::app()->session['table'];
}

问题是为游戏玩家长时间保存会话。如果你有很多用户,那将成为一个问题。

如果你有几个具有相同结构的表,可能你的数据库架构是错误的。如果是分片,则需要为此更改AR。

yii和分片中的主要问题是__construct()中的AR调用getMetaData()来获取表模式,因此您需要该级别的表名。

在论坛上搜索解决方案,我个人没有找到关于英语的好文章。这里有关于Yii和Redis here实现水平分片的文章。这是俄语,但你可以看一些代码。

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