【问题标题】:Several entities having a one to many relation with one specific entity多个实体与一个特定实体具有一对多关系
【发布时间】:2016-01-13 12:40:42
【问题描述】:

想象一个场景,我们有公司银行账户客户。公司和客户都可以拥有多个银行账户,但一个银行账户可以只属于一个客户或一家公司。我想知道设计这样一个不涉及复杂查询或业务逻辑的数据库的最佳方法,尤其是在我们需要从数据库中删除银行账户的时候。

我见过的一个解决方案是将银行账户的 ID 作为 JSON 字符串数组引用到公司或客户上,如下所示:

In customer or company
======================
id    name  bank_account
1     Bob   [2,3,4,5]

这不是一个糟糕的解决方案,但我想知道是否有更好的方法来做到这一点。

注意: 我正在使用Symfony 2.7.5 构建应用程序,因此使用Doctrine ORM 库。

【问题讨论】:

  • 如果是 mySQL,请使用具有正确设置外键依赖项的 InnoDB 表 - 将 cascade 用于 updatedelete - 这将允许您删除记录和任何依赖记录由于依赖关系,其他表也会被删除
  • @RamRaider 我认为如果我们只有一个实体与银行账户存在一对多关系,这将是适用的,但我不知道如何在这里应用。
  • 如果两个实体有共同的祖先,就可以应用,见下面我的回答

标签: php sql symfony database-design doctrine-orm


【解决方案1】:

解决这个问题的一种方法是让公司和客户都从一个共同的祖先那里继承,比如用户(看看doctrine inheritance)。然后在用户和银行账户之间会有一对多的关系,这很容易实现并且会照顾你所有的依赖关系。

【讨论】:

  • 我同意。正在写一个类似的答案。一个用户表,一个银行帐户详细信息表,以及一个匹配用户 ID 和银行帐户的表。这样他也可以在不删除银行帐户的情况下通过单个查询删除/更改匹配项
  • 你甚至不需要第三张桌子。 Doctrine 一对多关系是使用主实体中的外键实现的。如果您正确配置级联项目,Doctrine 将处理所有交互,例如删除关联实体
  • 是的。我知道。我的只是为该问题添加另一种可能的解决方案的一种方式。 :)
猜你喜欢
  • 2016-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-01
  • 2011-01-28
相关资源
最近更新 更多