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.
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
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
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