我正在尝试编写一个使用多个表的自定义关系,这种关系需要使用第一个表中的键连接到其他表。
每个表都有相同的列。
所以,让故事开始吧:
我正在开发一款基于在线策略的游戏。 (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_k1
,village_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
答案 0 :(得分:5)
您确定,您需要在框架级别解决此问题吗?我建议在这里使用像http://en.wikipedia.org/wiki/Shard_(database_architecture)
这样的东西答案 1 :(得分:3)
我认为您需要添加一些共享数据库。由于您的大型数据库,您无法通过框架进行管理。只需尝试管理数据库的共享数据库。您也可以尝试使用mysql集群来管理数据库Follow this link和 this这可能对您有所帮助。请记住,一个框架是一些功能集,因此您可以使用代码和支持环境(如数据库等)来操作您的函数。
答案 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中也是如此。