2014-07-04 11 views
5

Pracuję nad projektem Rails, który modeluje strukturę firmy ze schematem binarnego schematu macierzy. Każdy nowy użytkownik „wprowadzony” w hierarchii jak pokazano poniżej:Implementacja struktury firmy Forced Binary Matrix w Railsach

User insertion algorithm

Nie ma bilansowania i wszystkie poziomy muszą być wypełnione przed przejściem do następnego. Tylko kolejność wstawiania ma znaczenie przy wstawianiu nowych. Nasz system baz danych to Postgres.

Zamierzałem użyć jakiegoś klejnotu, aby pomóc mi w implementacji drzewa (Closure Tree jest stanowczym kandydatem), ale nie jestem pewien, jak podejść do ograniczeń (wstawiania, usuwania) tego "wymuszonego drzewa binarnego od lewej" do prawego "modelu.

Próbuję to wszystko zrozumieć, ale ponieważ nigdy nie brałem udziału w takich implementacjach (szczególnie w przypadku baz danych) myślałem, że mogę skorzystać z pomocy doświadczonych programistów na temat typowych pułapek lub gdzie powinienem umieścić specjalne Uwaga. Oczekuje się, że baza użytkowników wzrośnie dość szybko, więc martwię się o wydajność.

więc moje pytania:

  • Ponieważ utknąłem na relacyjnej bazie danych, co byłoby najlepszym sposobem Model ten schemat?
  • Czy jest jakaś dokumentacja lub klejnot, w który mogę się zagłębić, aby nauczyć się najlepszego sposobu implementacji wszystkich algorytmów, których będę potrzebować?

Z góry dziękuję za wskazówki/wskazówki.

+0

Jakie operacje należy wykonać na tej strukturze? – freemanoid

+0

Co pociąga za sobą usunięcie? Zakładam, że usunięcie ze środka drzewa nie powinno usuwać wszystkich zstępujących pracowników, więc czy ten poziom przesunięcia drzewa pozostanie do wypełnienia, czy też podnosisz dziecko do pustego miejsca? Obie te operacje będą wyglądały jak ponowne zrównoważenie, które według ciebie nie są potrzebne. –

Odpowiedz

0

mam na myśli ten sposób:

  1. każde drzewo ma identyfikator;
  2. każdy węzeł ma identyfikator;
  3. utworzyć tabelę o nazwie nodes, w których pola są: tree_id, parent_node_id, value, id

następnie u może odbudować to drzewo z jednym zapytaniu. Aby zaktualizować drzewo, po prostu zaktualizuj wszystkie węzły o odpowiadającym drzewom ID drzewa ...? Myślę, że organizacja nie będzie miała zbyt wielu pracowników, którzy ograniczają wydajność.

1

Oto rozwiązanie, które sprawdziło się u mnie.

  1. Utwórz aplikację szyn i określ PostgreSQL jako bazę danych.

  2. Dodaj gem_as_sane_tree klejnot do swojego gemfile.

  3. Wygeneruj model dla użytkowników z kolumną parent_id kolumna jako klucz obcy.

  4. Plik migracji bazy danych powinien wyglądać mniej więcej tak

    class CreateUsers < ActiveRecord::Migration[5.0] 
        def change 
        create_table :users do |t| 
         t.string :name 
         t.integer :parent_id 
         t.timestamps 
        end 
        end 
    end 
    
  5. Twój model powinien mieć następującą metodę:

    class User < ApplicationRecord 
        acts_as_sane_tree :order => "name" 
    end 
    

można znaleźć więcej informacji z poniższych linków:

https://github.com/chrisroberts/acts_as_sane_tree

http://www.gmarik.info/blog/2012/recursive-data-structures-with-rails/