複数のテーブルを使用するカスタマイズされたリレーションを作成しようとしています。このリレーションは、最初のテーブルのキーを使用して他のテーブルに結合する必要がありません。Yii複数のテーブルの1つのリレーション
各テーブルには同じ列があります。
ので、話は始めましょう:
私はオンライン戦略ベースのゲームを開発しています。
私は大きなテーブル(30.000.000行)を持っていて、100個の小さなテーブル(各テーブルの300.000行)でそのテーブルを分割しています。
アクションは村内で行われます。
村の詳細はvillage
テーブルに保存されています。
各村は大陸内に位置しているので、村に属する大陸を私に与えるk
という数字があります。
村のテーブルには、次のカラムがあります
ID - p.k. 地図上のx - x位置 地図上のy - y位置 k - f.k.大陸id 名前 user_id f.k. ポイント
私は100の大陸を持っているので、私は100の新しい小さなテーブルを持っています。
私はすべての建物の詳細を保存するテーブルもあります。
建物の詳細は、テーブルに保存されていました。
元のテーブルから私は今や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の場合、私は連結
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はすでに200億に成長しました。それは大丈夫です。 – ineersa