我想寫一個使用多個表的自定義關係,並且此關係需要通過使用第一個表中的鍵來連接到其他表。Yii一個關係爲多個表
每個表格都有相同的列。
所以,讓故事開始:
我正在開發一個基於在線戰略遊戲。 (PBBG - 持久瀏覽器爲基礎的遊戲)
我有一個大表(30.000.000行),我已經在100個較小的表(每個表300.000行)拆分該表。
行動發生在村莊內。
有關村莊的詳細信息存儲在village
表中。
每個村莊都位於一個大陸內,所以有一個k
數字,它給了我所屬的大陸。
該村莊的桌子具有以下列:
id-p.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
應該在需要時更改。
如果我可以使用village
的k
值,那會給我我需要加入的表的名稱。
若k = 2,我需要從village
跳轉到village_building_k2
使用CONCAT
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
由於擴展名而導致30密耳;它會上升到50密耳 –
這很好。你沒有這張表中的大數據,所以你可以索引它,它會很快。另外看看分區,你所做的實際上是分區,而不是分區。這個特性存在於mysql中(或者你使用的是什麼)。只需在您的餐桌上爲您所有的大陸製作100個分區。在1或2分區的範圍內選擇會非常快,但避免從多個分區中進行選擇。創建選擇索引測試速度後,其中一些可能會減慢你的速度。避免連接,GROUP BY,很多OR,LIKE運算符可能更多。 – ineersa
此外,您需要將AR更改爲DAO,其方式更快,內存消耗更少。如果堅持使用AR - 重寫SELECT COUNT(*)查詢,或爲dataProvider設置totalItemCount(例如全表的解釋)。避免使用索引批量插入/刪除。有了這個,你應該沒問題,我的DB已經長到了2億個,沒關係。 – ineersa