2017-01-12 4 views
0

Я не уверен, как определить уникальность нескольких полей.Doctrine composite key vs UniqueConstraint

Я прав, что оба моих следующих примера выполняют эту работу?

В чем разница, что вы предпочитаете?

Первые один:

/** @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 сгенерированным значением | auto increment или просто равное значение/строка? Возможно, вы можете привести несколько примеров в виде предварительного просмотра данных, чтобы было проще помочь вам отсортировать ваш прецедент. – Kwido

+0

Меня больше интересует общая концепция. Основное различие во всех аспектах. Когда использовать сначала, когда второе, когда комбинация? – Neon

+0

Обратите внимание, что Doctrine doc советует использовать комбинированный ключ. – Veve

ответ

0

Если вы хотите, чтобы убедиться, что название является уникальным над вашими различными продуктами вам не нужно сделать составной ключ из название и идентификатор.

Если вы уверены, что название вашего продукта уникально, вы можете просто использовать 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 создает уникальный индекс

Обе гарантии уникальности. И если я правильно понимаю это, основное отличие состоит в том, что первичный ключ не может иметь нулевые значения, но уникальный индекс может.