2008-10-24 4 views
4

Im пытается использовать для определения отношения «один ко многим» в одной таблице. Для примера позволяет сказать, что у меня есть таблица групп с этими записями:Отношение «один ко многим» в одной таблице

 
Group: 
    Group_1: 
    name: Atlantic Records 
    Group_2: 
    name: Capital Records 
    Group_3: 
    name: Gnarls Barkley 
    Group_4: 
    name: Death Cab For Cutie 
    Group_5: 
    name: Coldplay 
    Group_6: 
    name: Management Company 

группа Coldplay может быть потомком группы Capital Records, и ребенок группы управляющей компанией и Gnarls Barkley может быть только ребенком Атлантики Записи.

Каков наилучший способ представления этих отношений. Я использую PHP и mySQL. Также я использую PHP-Doctrine как мой ORM, если это помогает.

Я думал, что мне нужно создать таблицу ссылок, которая называется group_groups, которая имеет 2 столбца. owner_id и group_id. Однако я не уверен, что это лучший способ сделать это.

Любое понимание будет оценено по достоинству. Дайте мне знать, если я объясню свою проблему достаточно хорошо.

+1

Зачем вам дерево? состав? Почему у вас нет стола для художников и таблицы для управляющих компаний? – jonnii

+1

Да, я думаю, что это действительно первый вопрос, на который нужно ответить. – Totty

+1

Таблицы изготовлены для предметов того же характера. Не смешивайте разные объекты в одной таблице. –

ответ

3

Несколько вариантов:

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

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

-1

Да, вам нужен мост, в котором были указаны поля. Тем не менее, я бы подумал, что ваша таблица должна быть разделена, если она подчиняется тем же типам объектов, которые вы описываете.

+0

Что вы подразумеваете под расколом, не могли бы вы объяснить? – seanbrant

+0

Как было предложено в комментарии выше, вы должны разделить свои таблицы так, чтобы каждая таблица в лучшем случае содержала только один объект. Таким образом, все данные для альбомов находятся в одной таблице, художники в другой, наклейки в другой и т. Д. – Totty

-1

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

Вы можете добавить столбец с именем parent_id (разрешить null) и сохранить в нем идентификатор родительской группы. Затем вы можете присоединиться к sql, например: «Выберите a. , b. из группы родительских дочерних групп, родительский элемент parent.id = child.parent_id».

Я рекомендую использовать отдельную таблицу для этой ссылки, потому что: 1. Вы не можете поддерживать несколько родителей с полем. Вы должны использовать отдельную таблицу. 2. Импортировать/экспортировать/удалить сложнее с полем в таблице, потому что вы можете столкнуться с ключевыми конфликтами. Например, если вы пытаетесь импортировать данные, вы должны убедиться, что сначала импортируете родителей, а затем детей. С отдельной таблицей вы можете импортировать все группы, а затем все отношения, не беспокоясь о фактическом порядке данных.

7

Есть целый ряд возможных проблем с этим подходом, но с минимальным пониманием требований, здесь идет:

Там, кажется, на самом деле три «лица» здесь: Исполнитель/группа, Этикетка/Recording Co . and Management Co.

Артисты/группы могут иметь ярлык/запись CO Артисты/группы могут иметь управляющую компанию

Этикетка/Recording Co может иметь несколько художников/Bands

Management Co может иметь несколько художников/Bands

Таким образом, есть один-ко-многим между Recording Co и художников, а также между Management Co и художников ,

Запишите каждый объект только один раз в своей таблице с уникальным идентификатором.

Поместите ключ «один» в каждом случае из «много» - в этом случае, Исполнитель/группа будет иметь как Recording Co ID и управления Co ID

Тогда ваш запрос будет в конечном счете, присоединиться к Artist, Recording Co and Management Co.

С этой структурой вам не нужны таблицы пересечений, существует четкое разделение «сущностей», и запрос относительно прост.

+0

Я восхищаюсь вашим терпением ... На вашем месте я бы нажал на вопрос! Один голос за вашу доброту! –

+0

Одна из возможностей не охвачена - могут существовать компании, которые управляют другими компаниями в целом. То есть, могут быть ярлыки с коллекцией управляющих компаний; могут быть управляющие компании, имеющие коллекции этикеток. И т. Д. Не ясно из вопроса. –

+0

Как милостиво предположить, что вопроситель ошибочен? Я вижу, что предлагаю делать такие вещи, чтобы вопрос не был уместным, но не просто предполагал. – ysth

1

В этом конкретном случае вам было бы разумно следовать совету Кена Г, так как действительно кажется, что вы моделируете три отдельных объекта в одной таблице.

В общем, вполне возможно, что это может возникнуть - если бы у вас был стол «человек», и он моделировал, кто все друзья, для надуманного примера.

В этом случае у вас действительно будет «ссылка» или ассоциативная или брачная таблица для управления этими отношениями.

0

Я согласен с Ken G и JohnMcG в том, что вам следует отделить управление и ярлыки. Однако они могут забыть, что группа может иметь несколько менеджеров и/или несколько менеджеров в течение определенного периода времени. В этом случае вам понадобится много-много отношений.

  • управление имеет много групп
  • группы имеет много управления
  • этикетка имеет много групп
  • группы имеет много ярлыков

В этом случае вашего оригинала идея использования таблицы отношений является правильной , Это происходит со многими отношениями ко многим. Однако group_groups можно назвать лучше.

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

Смежные вопросы