在单个表上的条令映射,该表具有由3个字段组成的组合主键



我很难为以下类似类别的场景选择正确的映射

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(换句话说,实际扇区类别(的记录将有两个隐式父级:具有相同familyclasssector设置为NULL的A/A记录,最顶端的类别,具有相同的族值但CCD_ 10和CCD_。

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

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

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

(关闭:这意味着每个家庭+阶级+部门只允许一种食物。你确定这是你想要的吗?看起来很奇怪(

我应该添加一个自动递增主键,将当前的主键转换为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-dynomic-attributes(,所有这些都是有效的,但我只考虑案例1,因为这增加了真正的价值-你不必创建属性,简化了API。

相关内容

  • 没有找到相关文章

最新更新