Почему Doctrine создает индекс только для одного столбца в таблице ссылок? - PullRequest
2 голосов
/ 11 марта 2010

Как и в стеке, между Вопросом и Тегом существует отношение многие ко многим.

После запуска этих команд 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, которая помогает установить отношение «многие ко многим» между таблицами Tag и Question, я обнаружил, что Doctrine только создает «нормальный» индекс для столбца tag_id. Почему в этом столбце, а не в столбце question_id? Я не знаю.

Я думаю, что это странно, потому что индекс, который создает Doctrine, должен быть для обоих столбцов question_id и tag_id, и поэтому он должен стать «уникальным» индексом, а не «нормальным» 'one, потому что question_id и tag_id вместе образуют составной первичный ключ.

Правильно ли мое понимание? Если да, то почему Doctrine не делает это правильно?

Ответы [ 2 ]

2 голосов
/ 11 марта 2010

Я считаю, что Doctrine не поддерживает составные первичные (или внешние) ключи. Помните, проект Doctrine продвигается очень быстро, но он все еще довольно молод. Новые функции добавляются все время, хотя я не думаю, что многостолбцовые ключи запланированы для ветки 1.x.

Обходной путь может заключаться в создании уникального столбца первичного ключа, question_tag_id, в качестве одного из 3 полей таблицы QuestionTag.

0 голосов
/ 11 марта 2010

Если я правильно читаю ваш код, вам не следует снова определять отношения в вашей таблице QuestionTag.

И также возможно создать индекс по двум столбцам вручную (просто определите его в своей схеме), хотя я не видел, как применить уникальное ограничение к двум столбцам в Doctrine.

...