为什么Doctrine只在链接表中的一列上创建索引?

时间:2010-03-11 10:04:05

标签: database database-design symfony1 doctrine

就像stackoverflow一样,问题和标签之间存在多对多的关系。

运行这些symfony命令后:

./symfony doctrine:drop-db
./symfony doctrine:build-db
./symfony doctrine:build-model
./symfony doctrine:build-sql
./symfony doctrine:insert-sql

使用以下架构:

的schema.yml

Tag:
 columns:
   name:
     type: string(10)
     notnull: true
 relations:
     Questions:
       class: Question
       foreignAlias: Tags
       refClass: QuestionTag

Question:
  columns:
    html:
     type: string(1000)
  relations:
     Tags:
       class: Tag
       foreignAlias: Questions
       refClass: QuestionTag

QuestionTag:
  columns:
    question_id:
     type: integer     
     primary: true
    tag_id:
      type: integer      
      primary: true
  relations:
    Question:
      class: Question
      foreignAlias: QuestionTags
      type: many
      foreignType: one
    Tag:
      class: Tag
      foreignAlias: QuestionTags
      type: many
      foreignType: one

QuestionTag链接表中,有助于建立TagQuestion表之间的多对多关系,我发现Doctrine只创建了一个'正常'索引。 tag_id列。为什么在此列而不是question_id列?我不知道。

我认为这很奇怪,因为Doctrine创建的索引应该 question_idtag_id列上的,因此它应该成为“唯一”索引,而不是“正常”的,因为question_idtag_id一起形成复合主键。

我的理解是否正确? 如果是的话,为什么Doctrine没有以正确的方式做到这一点?

2 个答案:

答案 0 :(得分:2)

我相信Doctrine不支持复合主键(或外键)。请记住,Doctrine项目正在迅速发展,但它还很年轻。新功能一直在增加,但我不认为1.x分支计划多列密钥。

解决方法是创建一个唯一的主键列question_tag_id,作为QuestionTag表中的3个字段之一。

答案 1 :(得分:0)

如果我正确阅读您的代码,则不应在QuestionTag表中再次定义关系。

也可以手动创建两列的索引(只需在模式中定义它),尽管我还没有看到如何在Doctrine中的两列上应用唯一约束。