Připojení databáze, jejíž název se dozvím až po přihlášení uživatele
- kastanekdavid
- Člen | 39
Zdravím,
pracuju na aplikaci pro zpracovávání xml feedů. Pro každého uživatele se bude feed ukládat do zvláštní, a již existující, MySQL databáze, kterou potřebuji napojit až po přihlášení uživatele (protože do té doby neznám příslušný název DB).
Nemůžu tím pádem pracovat s deklarací databáze v config.neon.
Někteří radí vytvořit si připojení v BasePresenteru (po přihlášení) pomocí metody addService(). To ale způsobí, že ani nemůžu v config.neon deklarovat žádnou službu, která využívá toto databázové spojení, protože ho při inicializaci aplikace nenajde.
Už na tom sedím tak 8 hodin a nevím si rady. Nakopne mě někdo? :)
- kastanekdavid
- Člen | 39
No tak představ si, že feed představuje klíčová data z e-shopu daného uživatele. Každý uživatel může feedem poslat prakticky jakýkoliv množství různě pojmenovaných tabulek, který jsou v některých případech tak obrovský, že mi přijde z hlediska výkonu lepší držet je v oddělených databázích.
- saimons
- Člen | 293
No ja si myslim, ze by to nemel byt problem. Kolik muze jeden XML obsahovat produktu, radove tisice a to je pro DB zanedbatelne cislo, je na to stavena. Pak se urcite nake produkty budou opakovat, takze by se dalo pres vazebni tabulku delat parovani k jednotlivym uzivatelum. Pouzivame DB (MySQL 5.5) kde mam v jedne tabulce 10ky mil. zaznamu a neni s tim jediny problem. Teda uz je na to potreba nake lepsi VPS nebo samostatnej server, ale nake zakladni VPS neni o mc drazsi nez hosting.
Editoval saimons (30. 4. 2013 11:38)
- Petr Hudík
- Člen | 49
Domnívám se, že by bylo výhodnější se tomuto rozdělení vyhnout a tabulky nechat spojené nebo aplikace oddělit.
Pokud se rozhodneš pro rozdělení db, tak jednom projektu jsem řešil přepínání db na základě domény, vykopírováno z toho projektu, obsah configu.neon:
web:
class: myWeb
database:
class: Nette\Database\Connection
create: @web::getDatabaseService
authorizator:
class: Authorizator
a getDatabaseService pak vypadalo takto:
return new Nette\Database\Connection('mysql:host=localhost;dbname='.$this->dbName, $this->user, $this->password);
Editoval Petr Hudík (30. 4. 2013 13:05)
- kastanekdavid
- Člen | 39
Nakonec jsem se přiklonil k řešení problému pouze jednou databází.
Vytvořením instance Nette\Database\Connection v presenteru bych nemohl v config.neon odkazovat na toto připojení z žádné služby, a tedy bych si asi rozhodil celý návrh aplikačky (nebo tomu možná jen nerozumím :) ).
Každopádně díky všem!