Mysql表之间的关系
Mysql relationship between tables
我现在有一个问题,在 table 之间建立关系的最佳解决方案是什么:
我有:
- 客户端 table ID 名称 sector_id delegation_id
- 扇区 table id 名称
- 代表 table ID 名称 sector_id
我的问题是 在客户端 table 中同时拥有两个外键是一个好习惯还是仅 delegation_id 的键就足以在客户table(当然有加入tables)
解释更多
每个代表团属于一个部门。
每个扇区属于一个区域
每个客户都属于一个代表团,该代表团属于按地理区域分组的部门
这是我的实体文件:
Class 客户
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 部门
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 代表团
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
外键。
因此,您将从 Client
实体中删除 sector_id
外键,并使用通过 Delegation
实体的关系来查找给定内的所有 Client
实体Sector
,如果需要的话。
我现在有一个问题,在 table 之间建立关系的最佳解决方案是什么: 我有:
- 客户端 table ID 名称 sector_id delegation_id
- 扇区 table id 名称
- 代表 table ID 名称 sector_id
我的问题是 在客户端 table 中同时拥有两个外键是一个好习惯还是仅 delegation_id 的键就足以在客户table(当然有加入tables)
解释更多 每个代表团属于一个部门。 每个扇区属于一个区域 每个客户都属于一个代表团,该代表团属于按地理区域分组的部门
这是我的实体文件: Class 客户
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 部门
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 代表团
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
外键。
因此,您将从 Client
实体中删除 sector_id
外键,并使用通过 Delegation
实体的关系来查找给定内的所有 Client
实体Sector
,如果需要的话。