Я пытаюсь представить следующую рекурсивную связь в РСУБД:рекурсивный объект ж/из родителя/ребенка отношения
В качестве основного примера, мы имеем следующие поля:
1 - computer science
2 - computer engineering
3 - electrical engineering
4 - mathematics
И я хочу связать похожие поля друг с другом. Я мог бы использовать вторую таблицу, чтобы связывать поля друг с другом. Оптимально, я мог себе представить, что в таком виде:
+----------+----------+
| field1 | field2 |
+----------+----------+
| 4 | 1 | (math -> comp sci)
| 4 | 2 | (math -> comp eng)
| 4 | 3 | (math -> elect eng)
| 2 | 1 | (comp eng -> comp sci)
| 2 | 3 | (comp eng -> elect eng)
+----------+----------+
Однако, если ключ был (field1, field2), я вижу две потенциальные проблемы:
- кортежей может быть повторен, хотя и неупорядоченное
- это может усложнить запросы излишне, если не существует никакого значения, какое поле в какой столбец (как sgeddes указывает, запрашивая обе колонки и фильтрации дубликатов)
Например:
+----------+----------+
| field1 | field2 |
+----------+----------+
| 1 | 4 | (comp sci -> math)
| 4 | 3 | (math -> elect eng)
| 4 | 2 | (math -> comp eng)
| 3 | 4 | (elect eng -> math)
| 2 | 1 | (comp eng -> comp sci)
| 3 | 2 | (elect eng -> comp eng)
| 1 | 2 | (comp sci -> comp eng)
+----------+----------+
Как я должен подойти неиерархические рекурсивные отношения?
Должен ли я идти и намеренно дублировать каждый кортеж, как во второй таблице? Или есть другой метод, который я пересматриваю?
Я могу быть смущен (все же), но я думаю, что мне нужно много-ко-многим, и ваш пример позволил бы Литературе иметь одно подобное поле. * (Я обновил пример в своем вопросе) * –
@DavidKaczynski - Я уверен, что используя этот подход, вы можете связать N-N в этом отношении, но отношение 1-N в подобных группах. См. Правки выше. – sgeddes
Спасибо за разъяснение. Пожалуйста, позвольте мне спросить об этом: если я хочу получить все поля, похожие на чтение, как будет выглядеть этот запрос? например, 'select SimilarId, FieldId from SimilarField, где SimilarId = 3 или FieldId = 3' ..., но как я могу превратить полученные кортежи' (SimilarId, FieldId) в набор отдельных идентификаторов для запроса исходной таблицы поля ? –