MySQL: два внешних ключа в одной таблице, ссылающиеся на другую таблицу - PullRequest
2 голосов
/ 31 января 2010

Я сталкивался с чем-то, что раньше казалось простым, но я снова почесал голову. У меня есть таблица для пользователей:

user_id (PK) | username| email | something

... и таблица «представлений», когда один пользователь просматривал другого пользователя:

view_id (PK) | viewer_id | viewed_id | view_date

"viewer_id" и "Просмотренный_ид" оба являются user_ids, что позволяет мне искать отдельно случаи, когда пользователь был зрителем или просматриваемым.

Сначала я думал, что оба эти столбца будут внешними ключами, но, создав таблицы в моем файле schema.yml (я использую Doctrine 1.2) и указав два отдельных внешних отношения (по одному для каждого столбца), кажется, В доктрине учитываются только первые перечисленные внешние связи между этими двумя таблицами (user_id> viewer_id).

Меня сейчас смущает, правильное ли это поведение MySQL, проблема в Doctrine или проблема в моем подходе, или не о чем беспокоиться! Могут ли быть два отдельных внешних ключа из одной таблицы, сопоставленные одному и тому же столбцу в другой таблице? Это даже логично, учитывая, что JOIN все еще дает мне доступ к «представлениям» через user_id? Я правильно понял?

Спасибо за ваше время.

РЕДАКТИРОВАТЬ - Файл схемы:

User:
relations:
View: {class: View, local: user_id, foreign: viewer_id, type: many, foreignType: one, alias: View, foreignAlias: User}
View: {class: View, local: user_id, foreign: viewed_id, type: many, foreignType: one, alias: View, foreignAlias: User}

... only difference is viewer_id/viewed_id

Ответы [ 2 ]

5 голосов
/ 31 января 2010

А вот и мы: Вы указали одинаковые псевдонимы для отношений.

User:
  relations:
    viewed_by: 
       class: View
       local: user_id
       foreign: viewed_id
       type: many
       foreignType: one
       foreignAlias: viewed

    viewed:
      class: View
      local: user_id
      foreign: viewer_id
      type: many
      foreignType: one
      foreignAlias: viewer

Или вы устанавливаете отношение «многие ко многим» по-разному:

User:
   relations:
     viewed_by: 
       class: User 
       local: viewed_id
       foreign: viewer_id,
       refClass: View
     viewed:
       class: User
       local:viewer_id
       foreign: viewed_id
       refClass: View

и View должны выглядеть как

View:
  columns:
    viewed_id:
      type: integer
      primary: true
    viewer_id:
      type: integer
      primary: true

См. Документацию Doctrine по отношениям "многие ко многим" .

1 голос
/ 31 января 2010

Mysql допускает использование нескольких внешних ключей в одной и той же таблице, даже для одного и того же столбца в другой таблице, но я не могу сказать, почему доктрина создает только один из них:

mysql> CREATE TABLE test1 (id INT);
Query OK, 0 rows affected (0.00 sec)

mysql> CREATE TABLE test3 (ref1 INT, ref2 INT, FOREIGN KEY (ref1) REFERENCES test1(id), FOREIGN KEY (ref2) REFERENCES test1(id));
Query OK, 0 rows affected (0.01 sec)
...