2017-01-12 144 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创建独特索引

两者都保证唯一性。如果我理解正确,主要区别在于主键不能有空值,但唯一索引可以。