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

Should the entity identifier be the email or a non business related numeric id?

我正在构建一个将由一些用户使用的应用程序。根据业务逻辑定义,用户将通过邮箱来识别,所以整个系统中不会出现重复的邮箱。这是 UML 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;

"Should it be" 取决于您的要求。使用唯一的数字标识符并将 e-mail 字段设置为唯一的(如第一个片段中所发布的)是完全没问题的。这有助于在用户实体和其他实体之间建立关系,因为它们有一个 "simple" 字段用于连接表。

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

不要混淆 UNIQUE 和 PRIMARY KEY。 UNIQUE 值可以改变,但 PRIMARY KEY 不应该改变,但两者都是 INDEX

那么,对于您的情况,电子邮件是否可以改变您的业务逻辑?

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