是应该在Symfony中使用抽象关系还是使用正常的ORM关系?

时间:2017-02-01 21:00:14

标签: mysql doctrine-orm symfony

我正在重写一个Web应用程序,该应用程序在几年前由cakePHP中的另一个程序员编写,并且程序员没有将他的数据库设计为具有外键限制。我将快速解释cakePHP系统存在的缺陷。

  • "产品" table有一个名为" type"的字段。这可能是"正常"或" cpa"。 (不要担心每次转化费用代表什么,不重要)
  • "正常"产品会在"跟踪"中生成跟踪ID每次在浏览器中访问它们的表。 " CPA"类型在" cpatrack"中生成跟踪ID。每次访问时都会有表格。
  • (以下是问题)购买产品时,在"销售"中进行输入。 table和sales表中有一个名为" track_id"的字段。如果产品类型是"正常"来自"跟踪"的ID表存储在" track_id"中。如果产品是" cpa"来自" cpatrack"的ID表存储在" track_id"。

如果我正确设置Symfony并建立适当的关系,我就无法拥有" track_id"字段明显指的是不止一个实体,因此我需要做出决定。我已经研究了Symfony文档中的抽象关系,它主要适用于保持bundle不具有依赖关系,但它也可以让我在做类似的事情时选择正确的实体

$track = $sale->getTrackingId();

我是否应该考虑使用抽象关系来帮助解决这个问题,或者我应该在销售表中创建另一个字段,例如" cpa_track_id"并使用正常的关系?有什么建议吗?

1 个答案:

答案 0 :(得分:0)

您无法使用抽象关系。抽象关系是一种将bundle彼此分离的工具,但是当在应用程序中使用带有抽象关系的bundle时,你必须决定关系在实现时指向的实体类。您无法在运行时决定逐行指向哪个类。

如果您可以更改数据库架构,请查看class table inheritance。就像粗略的草图一样:

  • 使用列tracking_hdrid(“cpa”或“normal”)创建新表type,匹配的继承映射(trackingcpatrack为子实体表)
  • 假设您的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()