在具有由3个字段组成的主键的单个表上的主义映射

时间:2018-07-14 23:43:17

标签: symfony doctrine-orm symfony4 doctrine-mapping

我正在努力为以下类场景选择正确的映射:

The food entity has a composed primary key made of 3 fields plus a name field:
╔════════╦═══════╦════════╦════════════════╗
║ family ║ class ║ sector ║ name           ║ - family INT UNSIGNED NOT NULL
╠════════╬═══════╬════════╬════════════════╣ - class INT UNSIGNED DEFAULT NULL
║ 1      ║ NULL  ║ NULL   ║ Natural        ║ - sector INT UNSIGNED DEFAULT NULL
║ 1      ║ 2     ║ NULL   ║ Greens         ║ - name VARCHAR(200) NOT NULL
║ 1      ║ 2     ║ 1      ║ Spring veggies ║ - PRIMARY KEY (family, class, sector)
║ 1      ║ 2     ║ 2      ║ Spring fruits  ║
║ 1      ║ 2     ║ 3      ║ Summer veggies ║
╚════════╩═══════╩════════╩════════════════╝

此表与食品类别有关。它们只能是与family + class + sector匹配的一个条目。填充的主键字段越多,类别记录就越“具体”。具有family + class + sector(即实际的 sector 类别)的记录将具有2个隐式父级:a / A class < / em>记录,具有相同的familyclass,但sector设置为NULL,b /一个 family 记录,最高的类别,具有相同的家族值但是classsector都设置为NULL。

一个部门记录将有0个孩子,但有2个父母,这意味着$spring_fruit_object->getParents()将(急切地)返回食物实体的集合,例如[natural_hydrated_object, greens_hydrated_object]

实际上,考虑到上面列出的规则,我担心现有的关联映射都无法自动处理此用例。我可能必须从存储库类中构建自定义查询。

您将如何处理这种情况?谢谢。

1 个答案:

答案 0 :(得分:0)

(关闭:这意味着每个家庭+班级+部门仅允许一种食物。确定要吃吗?似乎很奇怪)

  

我应该添加一个自动递增的主键,将当前的主组合键转换为UNIQ索引,然后将其简单地与querybuilder一起使用吗?

IMO,应避免使用复合主键。它们可能很诱人,因为它们很有意义,但是:

  • 慢一点
  • 与常规不同,使您的工作变慢
  • 自动增量ID几乎没有增加任何额外的内容
  • 您将不得不为某些东西生成一个组合ID,例如路由。

文档文档提到了3个用例(https://www.doctrine-project.org/projects/doctrine-orm/en/2.6/tutorials/composite-primary-keys.html#use-case-1-dynamic-attributes),所有用例都是有效的,但我只考虑用例1,因为这增加了实际价值-您不必创建属性,就可以简化API。