表之间的Mysql关系

时间:2018-02-23 01:29:32

标签: php mysql foreign-keys relational-database

我现在有一个问题:在表之间建立关系的最佳解决方案是什么: 我有:

  • 具有id名称sector_id delegation_id
  • 的客户端表
  • ID为
  • 的扇区表
  • 具有id名称sector_id的委托表

我的问题是在客户端表中使用外键或只使用delegation_id的键足以在客户端表中进行索引和搜索(当然还有连接表)是一个好习惯

解释更多 每个代表团属于一个部门。 每个部门属于一个区域 并且每个客户属于属于在地理区域中分组的扇区的委托

这是我的实体文件: 班级客户

class Client {

    /**
     * @var int
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var string
     *
     * @ORM\Column(name="firstName", type="string", length=255)
     */
    private $firstName;

    /**
     * @var string
     *
     * @ORM\Column(name="lastName", type="string", length=255)
     */
    private $lastName;

    /**
     * @var string
     *
     * @ORM\Column(name="email", type="string", length=255, unique=true)
     */
    private $email;

    /**
     * @var string
     *
     * @ORM\Column(name="sector", type="string", length=255)
     */
    private $sector;

    /**
     * @var int
     *
     * @ORM\Column(name="delegation", type="integer")
     */
    private $delegation;

}

班级部门

class Sector {

    /**
     * @ORM\Id
     * @ORM\OneToMany(targetEntity="AppBundle\Entity\Delegation" ,mappedBy="sector")
     * @ORM\GeneratedValue(strategy="AUTO")
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @Assert\NotBlank()
     * @ORM\Column(type="string")
     */
    private $name;

    /**
     * @Assert\NotBlank()
     * @ORM\ManyToOne(targetEntity="AppBundle\Entity\Zone", inversedBy="id")
     * @ORM\JoinColumn(nullable=false)
     */
    private $zone;

}

班级代表团

class Delegation {

    /**
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @ORM\Column(type="string")
     */
    private $name;

    /**
     * @ORM\ManyToOne(targetEntity="AppBundle\Entity\Sector", inversedBy="id" )
     * @ORM\JoinColumn(nullable=false)
     */
    private $sector;

}

1 个答案:

答案 0 :(得分:0)

根据您更新的问题 -

如果每个Client属于Delegation,则Client实体应具有delegation_id个外键。

如果每个Delegation属于Sector,则Delegation实体应具有sector_id个外键。

如果每个Sector属于Zone,则Sector实体应具有zone_id个外键。

因此,您将从sector_id实体中删除Client外键,并通过Delegation实体使用该关系查找给定Client内的所有Sector个实体1}},如果需要的话。