[英]Phalcon\Mvc\Model and composite primary key
我將Phalcon \\ Mvc \\ Model用於我項目中的所有實體(以保持標准化)。 今天我必須在我的mysql數據庫中導入maxmind geoip數據庫,以實現某些實體和maxmind位置(和塊)之間的本機關系。
Maxmind數據庫默認以csv提供,因此如何在mysql中組織它是每個開發人員必須根據他的需求解決的問題。 Maxmind數據庫包含2個文件:
大多數教程建議使用以下表定義來存儲具有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)
));
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.