Отображение отношения между объектами в одной таблице - PullRequest
1 голос
/ 14 июня 2009

Я столкнулся с проблемой дизайна; В проекте у меня есть три таблицы: Лига, Игроки и таблица ассоциации LeagueToPlayers, которая отображает несколько соединений между первыми двумя (поскольку игрок может одновременно играть в двух или более лигах):

League        Players              LeagueToPlayers
Id Name       Id Alias             LeagueId  PlayerId
=--------     ------------         ----------------
1  League A   1  Longcat           1        1
2  League B   2  Leeroy Jenkins    1        2
3  League C   3  xyz               2        1
4  League D   4  qw3rty            2        3
              5  Myrkgrav          3        2
                                   4        1
  (...)           (...)            4        3
                                   5        1

                                     (...)

Моя проблема в том, что теперь я должен сопоставить игрока с игроком. С моей точки зрения, можно сделать две вещи: либо добавить в таблицу Player дополнительное поле (отображая другой PlayerId), что является довольно плохой ставкой, потому что при всех шансах это будет отношение 1 .. *, или другой таблицей ассоциации. создан (не очень люблю идею, но я думаю, что другого пути нет).

Мне бы хотелось услышать ваши взгляды на этот вопрос ... какие-нибудь яркие идеи?

С уважением, Hal

РЕДАКТИРОВАТЬ: как уже упоминалось в комментариях, это метафора. Тип объектов, представленных в таблице «Player», варьируется ОЧЕНЬ много (например, двести различных типов), и они действительно должны отображаться таким образом. Объекты в таблице Player могут ссылаться друг на друга, потому что они в конечном итоге участвуют в одном и том же процессе и, как таковые, они связаны друг с другом. Это соединение определенно 1 .. *

Ответы [ 2 ]

1 голос
/ 14 июня 2009

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

Это решение также более гибкое в том смысле, что оно, вероятно, ставит вас в более выгодное положение, если вам необходимо по какой-либо причине расширить модель.

1 голос
/ 14 июня 2009

Если это 1: *, то поместите его на * сторону (например, parent_id на дочернюю строку для иерархии).

Если это *: *, используйте другую таблицу корреляции.

...