我最近开始玩Doctrine ORM库,我了解了表之间的所有关联。
因此,我在单向关系和双向关系上存在分歧。
正如我所理解的,单向关系只有一方有主键,而这一方是拥有方,对吗?双向关系在两个表中都有主键,因此可以从两边都有关系,并在两边设置约束。
现在,我正在阅读有关关系的条令文档,您可以:单向和双向关联。
但是,它们会生成相同的SQL,以及具有相同主键和约束的相同表。所以我真的看不出这两者有什么不同。这两个例子都有一个关键。
正如我所理解的,真正的双向关系应该在两个表中都有指向另一个表的主键,对吧?举一个关于条令文件的例子,事实并非如此。两个例子给出了相同的结果,并且是相同的。
所以我所做的,就是这样,假设我有用户和卡实体,并且希望关系是OneToOne双向的。
/**
* @Entity
* @Table(name="users")
*/
class User
{
/**
* @Id
* @GeneratedValue
* @Column(type="bigint")
*/
protected $id;
/**
* @OneToOne(targetEntity="Card", mappedBy="User")
* @JoinColumn(name="card_id", referencedColumnName="id")
*/
protected $card;
/**
* @Column(name="user_name", type="string")
*/
protected $userName;
/**
* @Column(name="user_pass", type="string")
*/
protected $userPass;
}
/**
* @Entity
* @Table(name="cards")
*/
class Card
{
/**
* @Id
* @GeneratedValue
* @Column(type="bigint")
*/
protected $id;
/**
* @OneToOne(targetEntity="User", inversedBy="Card")
* @JoinColumn(name="user_id", referencedColumnName="id")
*/
protected $user;
/**
* @Column(name="post_title", type="string")
*/
protected $cardType;
}
这里的区别是我在两个对象/实体中都写了@JoinColumn。在条令的例子中只有一个。现在我会得到我认为的双向关系。如果我看一下EER图,我可以看到一条线从用户指向卡片,另一条线则从卡片指向用户。
我基本上做对了吗?条令文件有错吗?:D双向一对一关系在EER图中看起来如何?
谢谢!
唯一的区别在于PHP类接口,即是否存在指向所有者的属性(例如,上述Doctrine示例中的$customer
属性)。换言之,条令只需要知道它应该考虑单个属性($shipping
)还是两个属性($cart
和$customer
)。没有其他区别。因此,SQL代码是相同的(因为一个外键足以表示任何1:N关系),并且在EER图中也没有区别(因为在EER中,通常不会解决与PHP相关的实现细节)。
单向和双向与如何在数据库层中创建这些连接的后台算法无关。
他们谈论的只是如何使用这些连接。在单向关系中,您只能从一个站点访问目标。双向关系允许从两个(双方)调用连接。
在unidir中也是如此。rel.modela可以到达modelb,但是modelb不能到达modela(如果没有额外的工作)。如果你现在使用bidir。rel两种型号都可以毫无问题地相互访问
在学说术语中,单向关系定义了$modelA->getModelB()
方法,但不是$modelB->getModelA()
方法,而双向关系定义了两个方法(或访问器,无论您想如何调用它们)
在uml图中,它看起来像这样:
unidirectional
modelA --X------> modelB
bidirectional
modelA <--------> modelB