实体标识符应该是电子邮件还是与业务无关的数字ID?

时间:2019-07-09 06:37:38

标签: php symfony doctrine-orm

我正在构建一个将由某些用户使用的应用程序。根据业务逻辑定义,将通过电子邮件标识用户,因此不会在整个系统中重复发送电子邮件。这是UML类图的摘录:

  • User class (抱歉,由于信誉低下,我无法嵌入图像)

我一直在阅读人们如何使用Symfony 4和Doctrine ORM来实现它,每个人都在让Doctrine创建一个数字ID作为实体标识符。根据我的图表,我应该这样做吗?

这是我目前的状态:

 /**
 * @ORM\Entity(repositoryClass="App\Repository\UserRepository")
 * @UniqueEntity(
 *     fields="email",
 *     message="error.email_already_registered"
 * )
 */
class User implements UserInterface
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @ORM\Column(type="string", length=180, unique=true)
     * @Assert\NotBlank
     * @Assert\Email
     * @Assert\Length(min=4,max=180)
     */
    private $email;

应该与以下代码相似吗?

/**
 * @ORM\Entity(repositoryClass="App\Repository\UserRepository")
 */
class User implements UserInterface
{
    /**
     * @ORM\Column(type="string", length=180)
     * @ORM\Id()
     * @Assert\Email
     * @Assert\Length(min=4,max=180)
     */
    private $email;

2 个答案:

答案 0 :(得分:0)

“应该”取决于您的要求。既可以使用唯一的数字标识符,也可以将电子邮件字段设置为唯一(如第一个摘录中所述)是完全可以的。这有助于在用户实体和其他实体之间建立关系,因为它们具有用于连接表的“简单”字段。

如果将电子邮件地址字段用作该实体的唯一标识符,则必须在所有关系表中使用该值。我不确定这是否会自动发生,但是稍后更改地址时,您必须将此更改传播到所有相关表中。为避免麻烦,请使用数字标识符-永远不应更改的数字标识符,并始终引用该用户实体。

答案 1 :(得分:0)

不要对UNIQUE和PRIMARY KEY感到困惑。 唯一值可以更改,但主键不应更改,但两者均为INDEX

那么,就您而言,电子邮件可以改变您的业务逻辑吗?

如果是,请不要将其添加为PRIMARY KEY,而应仅是UNIQUE INDEX。否则,您可以将其用作主键。