Данные, ссылающиеся на обе таблицы в отношении m: n - PullRequest
0 голосов
/ 06 декабря 2010

Я работаю над системой на основе MySQL для управления данными от обработки пищевых продуктов. В этот момент я столкнулся со следующей конкретной проблемой:

У меня есть таблица А с некоторыми предметами:

Farmer      Quantity  
Farmer A    1000 kg  
Farmer B    500 kg

Тогда у меня есть таблица B, представляющая собой m: n-агрегацию данных из таблицы A:

Batch       Quantity     Quality etc.  
LI1         200 kg        ....  
LI2         12000 kg      ....

Для представления отношения m: n у меня есть таблица AB, которая соединяет два:

FK_Farmer    FK_Batch 
FarmerA      LI1   
FarmerB      LI1  
FarmerA      LI2  

Теперь проблема: некоторые партии в Таблице B на самом деле состоят из других партий ... что означает, что они рекурсивно составлены. Мне интересно узнать, каков наилучший подход с точки зрения проектирования баз данных для реализации этой ситуации.

Должен ли я включить дополнительный внешний ключ в таблицу AB, ссылающуюся обратно на таблицу пакетов? Должен ли я не применять внешние ключи и ссылаться как на фермеров, так и на таблицу партий через один и тот же столбец (и добавить флаг, чтобы указать рекурсию или что-то в этом роде)? Есть ли другое очевидное решение, которое я нашел?

Было бы неплохо иметь возможность выполнять детализацию запросов для всех данных через прямой MySQL, но это не обязательно.

Ответы [ 2 ]

0 голосов
/ 08 декабря 2010

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

FK_ParentBatch  FK_ChildBatch 
LI1             LI5   
LI1             LI6  
LI2             LI5
LI2             LI3
LI3             LI4

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

0 голосов
/ 06 декабря 2010

Самый простой способ представления данных - добавить указатель Parent в таблицу Batch. Корень иерархии будет иметь нулевое значение в этом поле. Любой пользователь без полномочий root будет указывать на своего родителя, который, в свою очередь, может указывать на другого родителя и т. Д. На столько уровней, сколько у вас может быть.

Запрашивать такую ​​структуру сложно, потому что стандартный SQL не может обработать дерево. Oracle имеет проприетарное расширение в своем диалекте SQL, но я не думаю, что MySQL делает. Это означает, что для погони всего дерева вам нужно либо написать код, который проходит через запросы, либо вы должны написать запрос, который выполняет несколько объединений для некоторого произвольного числа максимальных уровней.

Но я не знаю более простого способа обойти это. По сути, я планирую преследовать дерево с помощью кода, а не одного запроса.

...