簡體   English   中英

Phalcon \\ Mvc \\ Model和復合主鍵

[英]Phalcon\Mvc\Model and composite primary key

我將Phalcon \\ Mvc \\ Model用於我項目中的所有實體(以保持標准化)。 今天我必須在我的mysql數據庫中導入maxmind geoip數據庫,以實現某些實體和maxmind位置(和塊)之間的本機關系。

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列,這將是主鍵並為startIpNumendIpNum添加索引以使選擇更快?

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM