我现在有一个问题,什么是在表之间建立关系的最佳解决方案:
我有 :
ID名称为扇区_ID委托的客户表
ID名称为扇区的表
ID名称为ector_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;
}
最佳答案
根据您更新的问题-
如果每个Client
属于Delegation
,则Client
实体应具有delegation_id
外键。
如果每个Delegation
属于Sector
,则Delegation
实体应具有sector_id
外键。
并且,如果每个Sector
都属于Zone
,则Sector
实体应具有zone_id
外键。
因此,如果需要,可以从sector_id
实体中删除Client
外键,并使用通过Delegation
实体的关系查找给定Client
中的所有Sector
实体。
关于php - MySQL之间的关系表,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48939825/