1

プロジェクト内のすべてのエンティティにPhalcon\Mvc \ Modelを使用しています(物事を標準化するため)。今日、いくつかのエンティティとmaxmindの場所(およびブロック)の間のネイティブな関係を実装するために、mysqlデータベースにmaxmindgeoipデータベースをインポートする必要がありました。

Maxmindデータベースはデフォルトでcsvで提供されるため、mysqlでデータベースを整理する方法はすべての開発者が自分のニーズに応じて解決しなければならない質問です。Maxmindデータベースには2つのファイルが含まれています。

  1. GeoLiteCity-Blocks.csv(IP範囲を格納)
  2. GeoLiteCity-Location.csv(場所に関する情報を格納します)

ほとんどのチュートリアルでは、IP範囲を持つテーブルを格納するために次のテーブル定義を使用することをお勧めします。

CREATE TABLE IF NOT EXISTS `GeoLiteCity_Blocks` (
  `startIpNum` int(10) unsigned NOT NULL,
  `endIpNum` int(10) unsigned NOT NULL,
  `locId` int(10) unsigned NOT NULL,
  PRIMARY KEY (`startIpNum`,`endIpNum`)
) ENGINE=InnoDB;

ご覧のとおり、複合主キーがあります。Phalcon \ Mvc \ Modelでそのようなキーを使用しても大丈夫ですか?いくつかの制限があると思います(論理的には、それらは存在するはずです。たとえば、Phalcon \ Mvc \ Model :: findFirst($ key)メソッドの動作を予測することはできません)

実際、このテーブルが使用するディスクサイズは気にしません。私にとって重要なのは、パフォーマンスだけです。また、各エンティティ/テーブルの小さな側面を大量に覚えないように、すべてのモデルを標準化したままにしておきたいと思います。

だから、私の質問:複合キーでPhalcon \ Mvc \ Modelを使用しても大丈夫ですか、それともid主キーとなる1つの追加の列を作成し、インデックスを追加startIpNumendIpNumて選択を高速化する方が良いですか?

4

1 に答える 1

3

Phalcon \ Mvc \ Modelは、複合主キーを持つテーブルで使用できます。ただし、findFirstショートカットは使用できません。次の操作を実行できます。

GeoLiteBlocks::findFirst(array(
   'startipnum = ?0 AND endipnum = ?1',
   'bind' => array($start, $end)
));

また、コーディングを減らすためにモデルにメソッドを追加することもできます。

class GeoLiteBlocks extends Phalcon\Mvc\Model
{
    public function static findBlock($start, $end)
    {
        return self::findFirst(array(
           'startipnum = ?0 AND endipnum = ?1',
           'bind' => array($start, $end)
        ));
    }
}
于 2013-02-04T18:26:28.927 に答える