Jak v Nette\Database vyřešit SLOŽITĚJŠÍ pojetí vazby M:N?

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
_Martin_
Generous Backer | 679
+
0
-

Ve velmi nastavitelné aplikaci používáme systém uživatelsky definovaných číselníků. Namísto definování mnoha tabulek pro jednotlivé entity (číselníky využívá kde co) existuje tabulka jedna.

Mnoho tabulek

Osoby (person)
id name
1 Aleš
2 Petra
Položky číselníku (dial_item)
id dial_id name
1 1 Muž
2 1 Žena
Vazební tabulka (person_dial_item)
dial_item_id person_id
1 1
2 2

Tabulek typu person_dial_item bych musel mít spoustu pro každou entitu.

Zkusil jsem ji tedy nahradit následujícím:

Jedna tabulka

Vazební tabulka (entity_dial_item)
dial_item_id entity_id entity_name
1 1 person
2 2 person

V tuto chvíli mám ale problém s výběrem pomocí ->related. Potřeboval bych nastavit jiné jméno sloupečku (entity_id namísto person_id) a přidat podmínku pro sloupeček entity_name. Existuje vestavěná podpora jak toto řešit, případně mohla by podobná funkcionalita přibýt? Zatím to řeším úpravou Nettích tříd (Nette\Database\Table\ActiveRow a Nette\Database\Table\Selection), ale rád bych se vlastním úpravám FW vyhnul a také bych radši čistější řešení.

vrana
Člen | 131
+
0
-

V první řadě bych doporučil použít oněch „mnoho tabulek“, které na rozdíl od jedné tabulky ručí za integritu dat.

Řešením je místo Nette\Database použít NotORM, které dovoluje určit vlastní strukturu.

paranoiq
Člen | 392
+
0
-

Martine, šlo by problém popsat trochu šířeji? („číselníky využívá kde co“)

_Martin_
Generous Backer | 679
+
0
-

@paranoiq: Existuje mnoho číselníků a některé jsou využívány více entitami. Např. číselník měna (s položkami CZK, EUR,…) je využíván entitou zákazníka (pro určení preferované měny) a entitou bankovního účtu (pro určení měny, ve které je účet veden). V současné verzi systému je přes 20 číselníků, což znamená více jak 20 vazebních tabulek (více, než kolik číselníků existuje, neboť každý číselník je využíván nejméně jednou entitou).

@vrana: Nevadilo by potom v tom prvním případě, že (například) při uživatelem vytvářeném číselníku by musela vzniknout nová tabulka? Neumím se rozhodnout, co je v tomhle případě menší zlo. Integrita mě možná tolik netíží, používám DB spíš jako skladiště dat.

Do API NotORM jsem se díval, ale z uvedených příkladů jsem to nevyčetl. Mohl bys mi napsat příklad takového použití? Tyto specifické relace je potřeba pouze pro číselníky, na všechny ostatní vazby funguje velmi dobře výchozí nastavení.