Připojení databáze, jejíž název se dozvím až po přihlášení uživatele

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
kastanekdavid
Člen | 39
+
0
-

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? :)

saimons
Člen | 293
+
0
-

Bohuzel nevim jak presne to vyresit aby to bylo nejlepsi, jen by me zajimalo co te vede mit pro kazdeho uzivatel vlastni DB? Nikdy jsem takovy pristup nevidel a ani si uplne nedovedu predstavit, kde by se to dalo vyhodne vyuzit?

kastanekdavid
Člen | 39
+
0
-

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
+
0
-

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
+
0
-

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)

Foowie
Člen | 269
+
0
-

Buď bych udělal proxy na connection, nebo factory. Ikdyž ta továrnička by ti asi moc nepomohla, jedině že bys předával službám ji a né connection.

Editoval Foowie (30. 4. 2013 13:14)

mkoubik
Člen | 728
+
0
-

Udělej si na to továrničku (službu), kterou si předáš do presenteru a která bude vytvářet instanci Nette\Database\Connection.

Edit: pozdě

Editoval mkoubik (30. 4. 2013 13:08)

kastanekdavid
Člen | 39
+
0
-

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!