2014-01-06 47 views
5

我想寫一個使用多個表的自定義關係,並且此關係需要通過使用第一個表中的鍵來連接到其他表。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應該在需要時更改。

如果我可以使用villagek值,那會給我我需要加入的表的名稱。

若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

回答

3

我認爲你需要添加一些共享數據庫。由於你的大型數據庫,你不能通過你的框架來管理它。只需嘗試共享數據庫來管理數據庫。您也可以嘗試管理數據庫的mysql羣集Follow this linkthis這可能會對您有所幫助。請記住,一個框架是一些功能集,以便您可以使用代碼和支持環境(如數據庫等)來操縱您的功能。

2

實際上,您可以嘗試從某些全局參數傳遞db名稱,例如從會話中傳遞。

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

問題是爲您的玩家長時間保存會話。如果你會得到很多用戶,這將成爲一個問題。

如果你有很少的結構相同的表,可能你的數據庫結構是錯誤的。如果它是分片,則需要爲此更改AR。

yii和sharding中的主要問題是__construct()中的AR調用getMetaData()來獲取表模式,因此您需要該級別的表名。

在論壇上搜索解決方案,我個人沒有在英語上找到好的文章。這裏是關於Yii和Redis的水平分片實現的文章here。這是俄文,但你可以看到至少一些代碼。

30.000.000表是好的,如果你能正確使用它,甚至在mysql中。

+0

由於擴展名而導致30密耳;它會上升到50密耳 –

+2

這很好。你沒有這張表中的大數據,所以你可以索引它,它會很快。另外看看分區,你所做的實際上是分區,而不是分區。這個特性存在於mysql中(或者你使用的是什麼)。只需在您的餐桌上爲您所有的大陸製作100個分區。在1或2分區的範圍內選擇會非常快,但避免從多個分區中進行選擇。創建選擇索引測試速度後,其中一些可能會減慢你的速度。避免連接,GROUP BY,很多OR,LIKE運算符可能更多。 – ineersa

+0

此外,您需要將AR更改爲DAO,其方式更快,內存消耗更少。如果堅持使用AR - 重寫SELECT COUNT(*)查詢,或爲dataProvider設置totalItemCount(例如全表的解釋)。避免使用索引批量插入/刪除。有了這個,你應該沒問題,我的DB已經長到了2億個,沒關係。 – ineersa