Я реализовал следующие способы хранения реляционной топологии:
1. Общая таблица взаимосвязей узлов:
Таблица: отношение
Столбцы: id parent_type parent_id parent_prop child_type child_id child_prop
Для которых соединения обычно не могут выполняться большинством движков sql.
2. Соединительные таблицы для конкретных отношений
Таблица: Class2Student
Столбцы: id parent_id parent_prop child_id child_prop
Для которых могут выполняться соединения.
3. Хранение списков/строковых карт связанных объектов в поле text
на обоих двунаправленных объектах.
Класс: Класс
Свойства класса: идентификатор имени ученика
Столбцы таблицы: имя идентификатора student_keys
Строки: 1 история [{type:Basic_student,id:1},{type:Advanced_student,id:3}]
Чтобы включить соединения с помощью движков sql, можно было бы написать пользовательский модуль, который был бы еще проще, если бы содержимое student_keys было просто [1,3]
, т. е. отношение было к явному типу Student
.
Вопросы следующие в контексте:
Я не понимаю, в чем смысл соединительной таблицы. Например, я не вижу, чтобы на самом деле существовали какие-либо проблемы, на решение которых ссылаются следующие аргументы в пользу соединительной таблицы:
- Невозможность логически правильно сохранить двунаправленные отношения (например, нет потери данных в двунаправленных отношениях или любых отношениях с полем
keys
, потому что одно рекурсивно сохраняется, и можно довольно легко принудительно применить другие операции (удалить, обновить)). - Неспособность эффективно присоединиться
Я не запрашиваю мнения о вашем личном мнении о лучших практиках или каких-либо культовых заявлениях о нормализации.
Явные вопросы:
- Каковы случаи, когда нужно запросить соединительную таблицу, которая не предоставлена, путем запроса поля
keys
объекта-владельца? - Каковы проблемы логической реализации в контексте вычислений, предоставляемых механизмом sql, где предпочтительнее использовать соединительную таблицу?
- Единственная разница в реализации полей
junction table
иkeys
заключается в следующем:
При поиске запроса следующего характера вам нужно будет сопоставить поле keys
либо с пользовательской реализацией индексации, либо с какой-либо другой разумной реализацией:
class_dao.search({студенты:advanced_student_3,имя:история});
поиск классов, в которых есть конкретный ученик и история имени
В отличие от поиска в индексированных столбцах соединительной таблицы и последующего выбора соответствующих классов.
Мне не удалось найти ответы, почему таблица соединений логически предпочтительнее буквально по любой причине. Я не утверждаю, что это так, или у меня так или иначе есть религиозные предпочтения, о чем свидетельствует тот факт, что я применил несколько способов достижения этого. Моя проблема в том, Я не знаю, что это такое.