实体标识符应该是电子邮件还是与业务无关的数字 ID?
Should the entity identifier be the email or a non business related numeric id?
我正在构建一个将由一些用户使用的应用程序。根据业务逻辑定义,用户将通过邮箱来识别,所以整个系统中不会出现重复的邮箱。这是 UML class 图的摘录:
- 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;
"Should it be" 取决于您的要求。使用唯一的数字标识符并将 e-mail 字段设置为唯一的(如第一个片段中所发布的)是完全没问题的。这有助于在用户实体和其他实体之间建立关系,因为它们有一个 "simple" 字段用于连接表。
如果您将电子邮件地址字段用作该实体的唯一标识符,则必须在所有关系表中使用该值。我不确定这是否会自动发生,但在稍后更改地址时,您必须将此更改传播到所有相关表中。为避免麻烦,请使用数字标识符 - 永远不应更改且始终引用一个用户实体的标识符。
不要混淆 UNIQUE 和 PRIMARY KEY。
UNIQUE 值可以改变,但 PRIMARY KEY 不应该改变,但两者都是 INDEX
那么,对于您的情况,电子邮件是否可以改变您的业务逻辑?
如果是,请不要将其添加为 PRIMARY KEY,应该只是 UNIQUE INDEX。否则,您可以将其用作 PRIMARY KEY。
我正在构建一个将由一些用户使用的应用程序。根据业务逻辑定义,用户将通过邮箱来识别,所以整个系统中不会出现重复的邮箱。这是 UML class 图的摘录:
- 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;
"Should it be" 取决于您的要求。使用唯一的数字标识符并将 e-mail 字段设置为唯一的(如第一个片段中所发布的)是完全没问题的。这有助于在用户实体和其他实体之间建立关系,因为它们有一个 "simple" 字段用于连接表。
如果您将电子邮件地址字段用作该实体的唯一标识符,则必须在所有关系表中使用该值。我不确定这是否会自动发生,但在稍后更改地址时,您必须将此更改传播到所有相关表中。为避免麻烦,请使用数字标识符 - 永远不应更改且始终引用一个用户实体的标识符。
不要混淆 UNIQUE 和 PRIMARY KEY。 UNIQUE 值可以改变,但 PRIMARY KEY 不应该改变,但两者都是 INDEX
那么,对于您的情况,电子邮件是否可以改变您的业务逻辑?
如果是,请不要将其添加为 PRIMARY KEY,应该只是 UNIQUE INDEX。否则,您可以将其用作 PRIMARY KEY。