PHP / Nette Multitenant systém na Wedos rubrika: Programování: PHP

2 zapotocnylubos
položil/-a 9.5.2018

Ahoj,

chtěl bych vytvořit automatický multitenantní systém, kde by si zákaznící zakládali vlastní subdomény,...

prostředí:

Wedos hosting (PHP, jedna MySQL databáze/MariaDB, apache)

Chtěl bych se nejdříve zeptat jestli je možné vytvořit databázovou strukturu podobně jak to řeší knihovna pro Django, že vytváží schéma v databázi (PostgreSQL), jestli je toto možné i na MySQL.

Nechci mít u každého záznamu tenant_id a vytvářet separátní databáze na wedosu automaticky nejde.

Doctrine?
Bylo by možné naimplementovat toto v Doctrině a Nette?

Ptám se čistě z hlediska PHP a Wedosu, jeslti je na této levné infrastruktuře toto vůbec nějak realizovatelné.
Nebráním se jiným PHP frameworkům.

Díky za váš čas a jakékoli rady,
Luboš

Komentáře

  • saw41 : Použil bych jednu databázi s prefixama pro tabulky podle zákazníka. 10.5.2018
  • harrison314 : Ja by som pouzil jednu schemu, jedny tabulky a navrhol databazovu schemu tak aby pocas behu apliacie nebolo potrebne vytvarat nove tabulky. 10.5.2018
  • Vojtěch Semecký : V MySQL, ani v MariaDB, to bohužel nejde. SCHEMA a DATABASE znamená v těchto databázích totéž. Viz https://mariadb.com/kb/en/library/schema/ 11.5.2018
  • Kit : Dala by se však využít databáze SQLite, kterých můžeš mít kolik chceš. 11.5.2018
  • zapotocnylubos : S jak je na tom SQLite výkonově oproti mysql či postgresql? 11.5.2018
  • Kit : SQLite je pomalejší pro zápis, ale rychlejší pro čtení. 11.5.2018
odkaz
8 rmaslo
odpověděl/-a 16.5.2018

Tady, musel jsem si zjistit co to vlastně "multitenantní" znamená. A s překvapením jsme zjistil, že jednu takovou aplikaci zrovna píšu (nějaký rezervační systém).
Zvolil jsem řešení s jednou db, s jednou definovanými tabulkami a skoro v každé tabulce mám "tenant_id" (u mě akce_id). Samozřejmě třeba v faktury_rozpis už akce_id není protože je tam faktura_id ukazující na faktury z které si to načtu.
Z hlediska kódu počítám s tím, že každá akce bude mít vlastní doménu, všechny jsou směrované na jeden adresář s kódem a podle $_SERVER['HTTP_HOST'] poznám o koho jde. Pak je tam adresář skins s podadresáři dle domén, v nichž jsou nějaké CSS a IMG (každý zákazník bude mít vlastní vzhled).

Na žádné zásadní problémy jsem zatím nenarazil.

Komentáře

  • ivoszz : Napadá mne klasická hláška: Je to bezpečné? 16.5.2018
  • rmaslo : Tak když se to správně naprogramuje tak to určitě bezpečné je :-). Otázka by spíše mohla znít: "Co se musí udělat navíc oproti běžné apliakci, aby se nezobrazila cizí data?" Třeba z úrovně SQL je odpověď je vlastně jednoduchá, v každém dotazu na základní tabulku (tj. s akce_id) musí být navíc podmínka ' ... WHERE akce_id = '.GetAkceId(). Z úrovně třeba ORM by byla odpověď stejná - nesmí se zapomenout na toto omezení. A pak by mohla přijít otázka "dá se udělat nějaká pojistka, kdyby na to programátor zapomněl"? Určitě ano, já třeba všechna data vykresluji v nějakých gridech, grid ví na jaké je doméně z toho může zjistit akce_id a pokud by zjistil, že v (nevykreslovaném sloupci) akce_id je jiný údaj než akce_id z domény kde běží tak by výstup mohl zastavit. Dělal jsem takovouto pojistku? Ne, dotazy na data musí být napsány správně (správně nadefinovány v ORM, či nějakém vyšším nástroji) a musí vracet správná data ze všech hledisek - dělat speciální kontrolu na jeden druh chyb mi přijde zbytečné. 22.5.2018

Pro zobrazení všech 4 odpovědí se prosím přihlaste:

Rychlé přihlášení přes sociální sítě:

Nebo se přihlaste jménem a heslem:

Zadejte prosím svou e-mailovou adresu.
Zadejte své heslo.