2016-04-15 39 views
2

我很喜歡,他建議青睞一成不變的實體和而不是改變數據結構由馬可Pivetta在PHP英國會議2016(https://youtu.be/rzGeNYC3oz0?t=2011)中描述的技術 - 追加他們。作爲獎勵的變化歷史是一個很好的事情,有很多不同的原因,所以我想在我的項目中應用這種方法。讓我們來看看下面的用例:Doctrine2一成不變的實體,並附加唯一的數據結構

class Task { 
    protected $id; 
    /** 
    * Status[] 
    */ 
    protected $statusChanges; 

    public function __construct() 
    { 
     $this->id = Uuid::uuid4(); 
     $this->statusChange = new ArrayCollection(); 
    } 

    public function changeStatus($status, $user){ 
     $this->statusChange->add(new Status($status, $user, $this); 
    } 

    public function getStatus() 
    { 
     return $this->statusChange->last(); 
    } 
} 

class Status { 
    protected $id; 
    protected $value; 
    protected $changedBy; 
    protected $created; 

    const DONE = 'Done'; 

    public function __construct($value, User $changedBy, Task $task) 
    { 
     $this->id = Uuid::uuid4(); 
     $this->value = $value; 
     $this->changedBy = $changedBy; 
     $this->task = $task; 
     $this->created = new \DateTime(); 
    } 
} 

$user = $this->getUser(); 
$task = new Task(); 
$task->changeStatus(Status::DONE, $user); 
$taskRepository->add($task, $persistChanges = true); 

所有狀態更改我打算堅持在MySQL數據庫中。所以協會將是一個(任務)對多(狀態)。

1)通過當前狀態獲取任務的推薦方式是什麼? IE瀏覽器。所有當前打開,已完成的待處理任務。

$taskRepository->getByStatus(Status::DONE); 

2)什麼是這種技術你看來,有可能會出現在未來的一些缺點,如該項目將壯大?

3)如果是比較實用的(保存狀態變化的任務領域的序列化陣列,或在單獨的表?

感謝的意見!

回答

2

我想這是關閉它的一些基於意見,只是讓你知道。

這就是說,我一直對這個想法很感興趣,但我沒有真正看過它一個巨大的金額,但這是我的想法...

1.按狀態查找
我認爲您需要在連接中進行某種子查詢以獲取每個任務的最新狀態並與之匹配。 (我想指出的是,這只是看着SO而不是實際知識的猜測,所以它可能會好起來)。

SELECT t, s 
FROM t Task 
LEFT JOIN t.status s WITH s.id = (
    SELECT s2.id 
    FROM Status s2 
    WHERE s2.created = (
     SELECT MAX(s3.created) 
     FROM Status s3 
     WHERE s3.task = t 
    ) 
) 
WHERE s.value = :status 

或者,也許只是(提供的綜合ID &創建領域是獨一無二的)...

SELECT t, s 
FROM t Task 
LEFT JOIN t.status s WITH s.created = (
    SELECT MAX(s2.created) 
    FROM Status s2 
    WHERE s2.task = t 
) 
WHERE s.value = :status 

2缺點
我猜想,不必使用上述類型的查詢每個庫調用將需要更多的工作,因此,更容易出錯。由於您只附加到數據庫,它將只會變得更大,因此存儲/緩存空間可能會成爲問題,具體取決於您擁有的數據量。

3何處保存狀態
一成不變的實體的主要好處是,他們可以永遠緩存,因爲他們永遠不會改變。如果您在序列化字段中保存了任何狀態更改,那麼實體將需要可變,這會破壞目的。

相關問題