2011-12-08 28 views
1

我與MySQL有關內主要IDS以下問題所困擾:生成自己的主IDS(transactionsafe等)doctrine2

我有一個實體Client和實體Purchase,其中一個客戶端零到許多購買而購買只有一個客戶。

當我創建採購,我要分配它指的是客戶端和正在進行的數字,比如ABC1對於第一次購買的客戶ABC我自己的主鍵。購買表看起來是這樣的:

id | client 
abc1 | abc 
abc2 | abc 
def1 | def 
abc3 | abc 
def2 | def 

我的應用程序使用的Symfony2與doctrine2,所以我搜索,想了一會兒,然後在其內容的購買量爲特定客戶的PurchaseRepository實施的createPurchase方法,增加了一個並返回創建的採購與已經添加了ID:

public function createPurchase($client){ 
    $amount = $this->getAmountForClient($client) + 1; 
    $id= $client->getId() . $amount ; 

    return new Purchase($id); 
} 

有一些問題,這個解決方案:

  • 添加更多比沒有在dublicated主ID
  • 在同一時間運行腳本沖洗結果一個實體可能會導致dublicated主要IDS

有另一種方式我現在可能解決我遇到的問題是不知道的?我完全錯了嗎?任何幫助表示讚賞!

+0

爲什麼不能用[代理鍵]工作(http://en.wikipedia.org/wiki/Surrogate_key)? – danihp

+0

要麼我不明白它或者它不會幫助我很多:我需要這個屬性給它的客戶端,所以它必須看起來像描述。這意味着我必須生成它,既可以作爲主鍵,也可以作爲唯一字段。問題依然存在。我想在數據庫中使用它的原因是,我們有時會在數據庫中工作,這時候沒有太大的映射必須做容易,並且鍵是客戶端,數據庫等 – Sgoettschkes

回答

2

這就是爲什麼AUTO_INCREMENT功能存在,所以併發事務可以生成唯一主鍵值。

要使用自己的代碼執行此操作,在調用getAmountForClient()之前,必須先使用LOCK TABLES Purchase WRITE,以防止與導致重複鍵錯誤的其他事務處於競爭狀態。

沒有人做到這一點。他們放棄了您所描述的自定義主鍵的想法,而只是使用AUTO_INCREMENT。

+0

是的,我明白你的意思相同。如果我將客戶端的密鑰增加到隨機密鑰的要求,這會改變什麼嗎?就像我只需要創建密鑰一樣,檢查它是否存在,並在創建時重新創建另一個密鑰。 doctrine2有沒有辦法很好地處理這個問題? – Sgoettschkes

+0

如果你對一個隨機數沒問題,爲什麼不增加可能存在差距的數字? –

+0

我結束了使用auto_increment和obsfusic與一些小「算法」的id。 – Sgoettschkes