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