Tout dépend du contexte. Si t'es dans le cadre d'une modélisation de ton data layer, ce n'est pas considéré comme une mauvaise pratique. Ca s'appelle simplement une relation bilatérale. Par exemple, j'ai mes classes "Livre" et "Auteur". Quand j'accède à une instance de ma classe Livre, j'aimerais pouvoir obtenir l'auteur. Quand j'accède à une instance de ma classe Auteur, j'aimerais pouvoir retrouver les livres qu'il a rédigés. C'est tout à fait raisonnable de vouloir définir ce genre de relations et ce n'est pas une mauvaise pratique.
Pour reprendre les grands principes "SOLID", ils sont plus cohérents lorsqu'on parle de composants/modules de ton application. Ce sont des briques fonctionnelles composant ton soft qui sont responsables d'une ou plusieurs opérations assumées par ton programme. Le but fondamental de "SOLID", c'est de bien séparer les différentes briques de ton application pour qu'elles fassent seulement ce pourquoi elles ont été réalisées et qu'elles ne s'encombrent pas de détails liés au contexte d'exécution ou au contexte d'autres briques de ton application.
En respectant ces principes, si un jour tu te retrouves à devoir remplacer l'une de ces briques (maintenance évolutive, changement de technologie / framework, changement d'interfaces externes, etc.), ton travail s'avèrera beaucoup plus simple que si tu n'avais pas respecté ces principes.