MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Como modelar uma relação muitas autorreferencial com muitos pais?


Em vez de iterar pela árvore (mais como um gráfico direcionado na verdade) cada vez que você precisar recuperar todas as dependências de uma habilidade, você pode apenas iterar pelas dependências implícitas ao adicionar uma nova dependência a uma habilidade específica e salvá-las em uma tabela chamada 'Dependência' que mapeia uma habilidade para uma dependência e vice-versa. Por exemplo (as relações poderiam ser melhor redigidas):
class Skill
    has_many :dependers, class_name: 'Dependency', foreign_key: :dependee_id
    has_many :dependees, class_name: 'Dependency', foreign_key: :depender_id

    has_many :dependencies, through: :dependees
    has_many :depending, through: :dependers

    def add_dependency(skill)
        recurse_dependencies(skill)
    end

    def recurse_dependencies(skill)
        # perform this check to avoid circular and duplicate dependencies
        if !depender_ids.include?(skill.id) && !dependee_ids.include?(skill.id)
            dependee_ids << skill.id
        end

        skill.dependencies.each do |dependency|
            recurse_dependencies(dependency)
        end
    end
end

class Dependency
    belongs_to :dependee
    belongs_to :depender
end

Você deve então ser capaz de fazer coisas como:
@front_end_development.dependencies
@front_end_development.depending
@front_end_development.add_dependency(@html)