Php Phalcon\Mvc\Model和复合主键

Php Phalcon\Mvc\Model和复合主键,php,composite-primary-key,phalcon,Php,Composite Primary Key,Phalcon,我对项目中的所有实体使用Phalcon\Mvc\Model(保持标准化)。 今天,我必须在mysql数据库中导入maxmind geoip数据库,以实现某些实体和maxmind位置(和块)之间的本机关系 默认情况下,Maxmind数据库以csv格式提供,因此如何在mysql中组织它是每个开发人员都必须根据自己的需要解决的问题。Maxmind数据库包含2个文件: GeoLiteCity-Blocks.csv(存储ip范围) GeoLiteCity-Location.csv(存储有关位置的信息) 大

我对项目中的所有实体使用Phalcon\Mvc\Model(保持标准化)。 今天,我必须在mysql数据库中导入maxmind geoip数据库,以实现某些实体和maxmind位置(和块)之间的本机关系

默认情况下,Maxmind数据库以csv格式提供,因此如何在mysql中组织它是每个开发人员都必须根据自己的需要解决的问题。Maxmind数据库包含2个文件:

  • GeoLiteCity-Blocks.csv(存储ip范围)
  • 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
    列,这将是主键,并将索引添加到
    startIpNum
    endIpNum
    以更快地进行选择?

    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)
            ));
        }
    }