簡體   English   中英

在這種情況下應該采取哪種方法?

[英]Which approach should I take in this case?

我已經用Identity Map模式實現了Data Mapper模式。 簡而言之:當我想從數據庫中獲取2000個對象時,映射器將根據包含對已創建對象的引用的哈希映射檢查結果集。 如果哈希映射中已經有一個ID,則會將舊對象添加到返回數組中。 否則,將創建一個新對象並將其添加到返回數組。 返回數組將包含2000個對象。

注意:此數字是理論值! 該平台可能非常頻繁,因此每分鍾甚至每秒可能發生多次。

問題:哪種選擇更好,為什么?

A)從數據庫中檢索所有2000個對象。 遍歷記錄集(2000行),並對照身份映射表檢查每個id。 如果在其中,請將身份映射的引用對象添加到對象數組。 如果不是,請創建一個新對象並將其添加到結果數組。

B)創建一個(可能是巨大的)SQL查詢,該查詢排除身份映射中的所有ID。 獲取一個僅包含新對象數據的記錄集。 創建新對象時,無需檢查每一行的身份映射。 合並了許多字符串連接操作以構建查詢,但可以節省一大堆哈希映射查找。

您會采用哪種方法? (是的,我知道,我應該同時實現兩個版本並進行性能測試,但是也許有人可以從實際經驗中回答這個問題)

我會和B一起去。

我認為這不需要復雜的字符串連接。 假設您的ID是純數組鍵,則只需執行以下操作:

$ids   = implode(',', array_keys($hashmap));
$query = sprintf('SELECT * from records WHERE id NOT IN (%s)', $ids);

您可能想要為查詢字符串添加一些清理功能。

如果您已經將SplObjectStorage用於哈希映射,則必須遍歷該映射以從存儲的對象中獲取ID。 根據那里已有的物品數量和要獲取的數量,使用A或B可能更好。這取決於。 但是,有了SplObjectStorage,您就不必為附加已有的對象而煩惱,因為這已經由本機處理了,例如

$map = new SplObjectStorage;
$one = new StdObject;
$map->attach($one);
$map->attach($one);
$map->count(); // returns 1

所以,是的。 我想這是一個基准測試問題,取決於您的特定情況。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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