我正在重写一个Web应用程序,该应用程序在几年前由cakePHP中的另一个程序员编写,并且程序员没有将他的数据库设计为具有外键限制。我将快速解释cakePHP系统存在的缺陷。
如果我正确设置Symfony并建立适当的关系,我就无法拥有" track_id"字段明显指的是不止一个实体,因此我需要做出决定。我已经研究了Symfony文档中的抽象关系,它主要适用于保持bundle不具有依赖关系,但它也可以让我在做类似的事情时选择正确的实体
$track = $sale->getTrackingId();
我是否应该考虑使用抽象关系来帮助解决这个问题,或者我应该在销售表中创建另一个字段,例如" cpa_track_id"并使用正常的关系?有什么建议吗?
答案 0 :(得分:0)
您无法使用抽象关系。抽象关系是一种将bundle彼此分离的工具,但是当在应用程序中使用带有抽象关系的bundle时,你必须决定关系在实现时指向的实体类。您无法在运行时决定逐行指向哪个类。
如果您可以更改数据库架构,请查看class table inheritance。就像粗略的草图一样:
tracking_hdr
和id
(“cpa”或“normal”)创建新表type
,匹配的继承映射(tracking
和cpatrack
为子实体表)tracking_id
是一个签名的整数(通常是因为很多人都懒得添加UNSIGNED
...)并且所有现有值都是正数,将cpatrack
表中的所有ID乘以-1,以防止与tracking
表冲突INSERT INTO tracking_hdr (id, type) SELECT id, 'normal' FROM tracking;
INSERT INTO tracking_hdr (id, type) SELECT id, 'cpa' FROM cpatrack;
sales
表以取消相关产品为“cpa”产品的tracking_id
sales
表格上创建指向tracking_hdr
这样,对数据库模式的更改相对较小,特别是旧的cakephp代码的只读访问仍然有效。但是,您应该记住,类表继承可能会对性能产生影响,因为如果您不小心,它很容易导致相当复杂的JOIN
查询。
如果您无法对架构进行任何更改,我认为您运气不好,必须使用选项1,getTrackingId()
。