Мое приложение загружает большое количество данных из базы данных в сложную структуру данных. В памяти структуры данных ressembles структуру базы данных, что означает, что, если база данных содержит следующие таблицы:Циклические зависимости во внешних ключах: использовать его или избегать?
- таблицу А, ключ А1
- таблицу В, ключ В1, один из столбцов является внешним ключом к [ключу] таблицы А,
- таблицы C, ключ представл ет собой C1, один из столбцов является внешним ключом к [ключу] таблица B
Тогда у меня есть классы A, B и C и:
- член данных B (B) :: m_a является указателем на
- член данных C (C :: M_B) представляет собой указатель на B
Это означает, что если загрузить базы данных, что я должен загрузить его в правильном порядке. Если я сначала загружу C, он будет жаловаться, что он не может установить значение C :: m_b, потому что экземпляр, в котором он должен указывать, не был загружен.
Проблема заключается в том, когда есть также столбец А, что является внешним ключом к одной из других таблиц, скажем C.
я мог бы решить эту проблему путем загрузки всех внешних ключей в виде строк, а затем выполнить поиск после загрузки всех данных, но поскольку мне иногда приходится загружать миллионы записей, я не могу позволить себе тратить память на эти (хотя и временные) строки.
Прочитав о хорошем дизайне (например, в книге «Масштаб C++ Software Design»), мне кажется, что плохая идея иметь круговые ссылки вообще. . если файл X.H включает Y.H, но Y.H также включает X.H, у вас, вероятно, плохой дизайн; если класс X зависит от класса Y, и наоборот, у вас, вероятно, есть плохая конструкция, которая должна быть решена путем извлечения этой зависимости и введения третьего класса Z, который зависит от X и Y (X и Y больше не будут зависеть от eachother) ,
Это хорошая идея также распространить это правило проектирования на дизайн базы данных? Другими словами: предотвращение циклических ссылок во внешних ключах.
Почему? Вы не подтверждаете свое утверждение. – cdmckay