2017-01-12 114 views
0

我不確定,如何定義多個字段的唯一性。學說組合鍵vs唯一約束

我說得對,以下兩個例子都可以完成這項工作嗎?

有什麼不同,你喜歡什麼?

第一招:

/** @ORM\Id */ 
private $id; 

/** @ORM\Id */ 
private $title; 

第二個:

/** @ORM\Table(name="productitem", uniqueConstraints={@UniqueConstraint(name="product_unique", columns={"id", "title"})}) 
*/ 
class ProductItem 
{ 
private $id; 
private $title; 
} 
+0

您的ID是否爲生成值|自動增量或只是一個普通的值/字符串?也許你可以舉一些例子作爲數據預覽,這樣可以更容易地幫助你分類你的用例。 – Kwido

+0

我對一般概念更感興趣。涉及的所有方面的主要區別。何時使用第一,何時使用第二,何時組合? – Neon

+0

請注意,Doctrine doc建議不要使用組合鍵。 – Veve

回答

0

如果你想確保你的標題是唯一在你不同的產品,你不需要做複合鍵出來的標題和ID。

如果你確定你的產品標題是獨一無二的,你可以直接使用title作爲關鍵。但不推薦使用可能會改變其實際生命週期的內容作爲主鍵(並且產品標題在其生命週期中可能會發生變化)。在這種情況下,最好使用具有標識符(代理鍵)的不同列。

您可以簡單地使用unique屬性將標題標記爲唯一標記,因此不需要使用UniqueConstraint。查詢the Doctrine documentation chapter: 21.2.1. @Column瞭解更多詳情。

所以我建議如下:

/** 
* @ORM\Id 
* @ORM\Column(type="int") 
*/ 
private $id; 

/** 
* @ORM\Column(type="string", unique=true) 
*/ 
private $title; 
0

我從我的數據庫PostgreSQL的試驗得出的結論,即:

  1. @Id創建主鍵(複合如果有更多的屬性共享此註釋)

  2. UniqueConstraints創建獨特索引

兩者都保證唯一性。如果我理解正確,主要區別在於主鍵不能有空值,但唯一索引可以。