Kacířská myšlenka: má opravdu cenu snažit se vždy o nějakou optimalizaci a normalizaci databázového schématu?
Pokud je jediným účelem databáze perzistence objektů doménového modelu, lze zvážit i použití některé z metod mapování doménového module do databáze, tak jak je to pospáno třeba v knize od Fowlera:
Single table inheritance (str. 278)
ftp://ftp.heanet.ie/mirrors/sourceforge/w/we/webtune/Patterns%20of%20Enterprise%20Application%20Architecture.pdfV tomto případě vytvoříš jednu obrovskou tabulku, která bude obsahovat různé datové typy, se sloupečky pojmenovanými podle členských proměnných, případně dokonce můžeš vytvořit tabulku se sloupečky text1, text2, text3..., date1, value1, value2, value3,... ,date1,date2, date3,...
případně u těch textů mít několik krátkých textových polí a několik dlouhých.
Nejsem si jistý, ale PostgreSQL funguje v některých ohledech podobně jako Oracle, takže nad touto obecnou tabulkou možná půjde vytvořit view které bude obsahovat sloupečky pojmenované podle tvé členských atributů tvé třídy, a přitom nad tímto view půjde dělat CRUD (tedy insert, select, update i delete). Mapování pak provedeš v PHP v nějaké bázové tříde ze které podědíš své objekty, ty budou deklarovat viewčko (a případně membery) do kterého se to bude cpát a možná nějaké metody které se zavolají po načtení objektu z databáze.
Kromě sloupečků z daty by tvá tabulka měla také obsahovat sloupečky ve stylu i_user, i_date, u_user, u_date a e_cnt kde i_user bude uživatel který vložil sloupeček, i_date kdy to vytvářel, u_user je uživatel který to naposledy editoval a u_date je čas editace, e_cnt je pak počítadlo změn pro optimistické zamykání, to bude jako member v bázové třídě a při načtení objektu se uloží. Pokud uživatel bude editovat záznam a změny uloží, tak nejdříve ověří jestli je e_cnt pořád stejné jako jeho member, a pokud ano tak jej při ukládání zvyší o 1. Pokud ale stejné není, někdo ty data změnil a on musí tuto situaci řešit (zahodit změny, udělat nějaký merge,...).
Toto je celkem obecné schéma řešení perzistence, overkill, ale jak se ti bude doménový model aplikace rozrůstat, ušetří ti to spoustu problémů. Jedná se vlastně o základ jedoduchého frameworku, a pak se naskýtá otázka, jestli nějaký nepoužít. Pokud ale nemůžeš a se psaním teprve začneš, zvaž i tuto možnost.