2012-03-29 19 views
6

Próbowałem napisać "dobry kod" i użyć wtyczki zależności, aby przekazać obiekty bazy danych w konstruktorach moich klas.Buforowanie obiektów MongoDB w PHP

Konstruktorzy są ogólnie biorąc z tego formularza:

public function __construct(MongoDB $db) { 
    $this->collection = $db->collectionName; 
} 

Zauważyłem, że każdy obiekt utworzony, o nowyMongoCollection jest tworzony. (Czyli dostęp do właściwości $db->collectionName dwukrotnie zwraca dwa odrębne obiekty, a nie sam obiekt)

Używam klasę bazową styl ActiveRecord, tak, że obiekty są w stanie Crud siebie.

Teraz, gdy używam jakiejś funkcji getAllRecords() i zwracam 100 tych obiektów, tworzone są 100s obiektów MongoCollection. (Szybkie spojrzenie na źródło sterownika wydaje się wskazywać, że tam też są tworzone nowe obiekty, a nie tylko nowe reprezentacje w PHP).

Zrobiłem to poprzez owinięcie klas Mongo i MongoDB w celu zaimplementowania buforowania.

class MyMongo extends Mongo 
{ 
    private $objectCache = array(); 

    public function __get($name) { 
     return array_key_exists($name, $this->objectCache) 
      ? $this->objectCache[$name] 
      : $this->objectCache[$name] = new MyMongoDB($this, $name); 
    } 
} 

class MyMongoDB extends MongoDB 
{ 
    private $objectCache = array(); 

    public function __get($name) { 
     return array_key_exists($name, $this->objectCache) 
      ? $this->objectCache[$name] 
      : $this->objectCache[$name] = new MongoCollection($this, $name); 
    } 
} 

moje pytania są następujące:

  • Czy to ma zachowanie MongoDB? Czy naprawdę powinien on zwracać za każdym razem nowy obiekt, czy jest to błąd/funkcja w sterowniku PHP lub Mongo (czy istnieje przypadek użycia dla potrzeb 2 obiektów dla tej samej kolekcji?)
  • Czy będę powodować problemy dla siebie przez buforowanie obu/obu obiektów, które są tworzone i ponowne ich używanie.
  • Jak inni ludzie zwykle radzą sobie z pracą z MongoDB? Czy powinienem całkowicie zastosować inne podejście? (Tj DataMapper)

Dzięki

Leigh.

Odpowiedz

2

Jest to celowe, ponieważ kolekcje mają właściwości inne niż ich nazwy związane z nimi (w i wtimeout w tej chwili, bardziej planowane na przyszłość). Jeśli wszystko, na czym ci zależy, to nazwy, to dobrze jest je buforować.

+0

Dzięki @kristina, myślę, że wszelkie zmiany, które musiałbym wprowadzić, aby były w całej treści, były takie same we wszystkich kolekcjach, więc wydaje się, że to nazwa kolekcji, na której mi zależy. Czy mogę zapytać, jak zwykle zarządzasz swoimi obiektami danych? Czy używasz ActiveRecord, DataMapper, czegoś innego lub po prostu wszystkiego, co wydaje się najlepiej pasować? – Leigh

+0

Napisałem sterownik, więc moja wiedza na ten temat jest głównie teoretyczna :) Użytkownicy z bardziej praktycznym doświadczeniem są prawdopodobnie lepiej wykwalifikowani, aby odpowiedzieć na trzecią część pytania. – kristina

+0

Wiem, że napisałeś sterownik, dlatego cię naprzykrzam;) - Ale TY na twój czas, wiem, że jest kilku facetów na czacie PHP, którzy używają Mongo, pójdę ich zabezpieczyć. – Leigh

1

Przekazywałem MongoCollection do moich obiektów zamiast MongoDb. Moje rozumowanie polegało na tym, że wybór kolekcji w obiekcie byłby ukrytą zależnością (może być przesadą), a następnie w testach jednostkowych mogę kpić z obiektu MongoCollection.

+0

Moje konstruktory mają w nich 'parent :: __ construct ($ db-> collection)'.* Moje rozumowanie * było takie, że obiekt jest w porządku, wiedząc, co to jest jego własna kolekcja, i nie chciałem śledzić setek kolekcji poza obiektem. – Leigh