Jak pojmenovat: změna struktury versus kolekce rubrika: Programování: Jiné

9 Taco
položil/-a 20.11.2019
 
upravil/-a 20.11.2019

Ahoj.

Struktura je například

{
    name: "John Dee"
    age: 42
    langs: [
       {id: en, title: "engl"}
       {id: fr, title: "franc"}
       {id: la, title: "latin"}
    ]
}

Kolekce je například

[
     {id: en, title: "engl"}
     {id: fr, title: "franc"}
     {id: la, title: "latin"}
]

Chci vytvořit commandy, a na jazyk se mi vtírá slovo Mod[ify]. Jenže docházím k závěru, že je dost velkej rozdíl mezi změnou kolekce a změnou struktury. V případě změny kolekce používám dále commandy Del filter, Add filter. Což v případě struktury nemá smysl. Zřejmě. Teoreticky bych samozřejmě mohl psát změnu klíče struktury jakože filtr, no nejsem si jist.

Jak byste to pojmenovali? Nebo byste to nerozlišovali? Nebo něco jiného? Díky za postřehy.

PS: ModCollection a ModStruct mě samozřejmě napadlo :-)

odkaz
8 rmaslo
odpověděl/-a 21.11.2019

Já to čemu říkáš "struktura" říkám Objekt a je to jen RO. A tomu čemu říkáš "kolekce" říkám buď řádek (Row) pokud je zdrojem více tabulek anebo záznam (Record) pokud je zdrojem jedna tabulka a je to tedy RW.

A v kódu volám funkce jako:

//"Jednozáznamové" načítání
$ClovekRec = GetRec('lide', 'id', $HledaneId);  //lide je primo název tabulky
$ClvFirRow = GetRow('SELECT lide.*, firmy.nazev FROM lide LEFT JOIN firmy ON lide.firma_id = firmy.id WHERE lide.id = '.SafeValue($HledaneId));
$ClovekObj = GetObj('lide', 'id', $HledaneId); //To ze to má dotáhnout langs si to vezme z relací a natáhlo by to něco podobného tvé struktuře, akorát by tam byly i vázací id.
 
//Operace nad record
UpdRec('lide', 'id', $ZapisovaneId, ['prijmeni'=>'Novák']);
UpdRec('lide', 'id', $ZapisovaneId, $ZmenyClovekaRec);
InsRec('lide', ['prijmeni'=>'Novák', 'jmeno'=>'Jan']);
InsRec('lide', $NovyClvRec);
DelRec('lide', 'id', $MazenyClovekId);
 
//Vícezáznamové načítání
$LangRecs = GetRecs('jazyky', 'clovek_id', $HledaneClovekId); //Vrátilo by něco podobného tvé kolekci, zase včetně id-ček
$LangRows = GetRows('SELECT jazyky.*, lide.prijmeni FROM jazyky LEFT JOIN lide ON jazyky.clovek_id = lide.id WHERE lide.id = ...');
$AktivniJazyky = ColumnRecs($LangRecs, 'lang_code'); //Vrátí něco jako  ['en', 'fr', 'la']
$LideObjs = GetObjs('lide', 'firma_id', 5);  //nemam nikdy jsem nepotřeboval, ale dovedu si představit
 
//a kdybych filtroval v PHP a ne zásadně v db tak bych měl něco jako
$FilterLangRecs = FilterRecs($LangRecs, 'lang_code', ['en', 'fr']);
//dovedu si predstavit i 
$FilterObjs($ClovekObjs, 'age', ['42']);
//a teoreticky i 
$FilterObjsSub($ClovekObjs, 'langs', 'lang_code', ['en', 'fr']);
 
//Tohle už podle mne patří 100% do db, ale čistě teoreticky si dovedu představit
ModifyRecs($LideRecs, function($Row) {$Row['age'] = $Row['age']+1; return $Row;});

ale nevím jestli Ti to k něčemu bude a není to moc OT. Protože já vlastně s datama ve smyslu filtrování, řazení, hromadné úpravy, atd... v PHP nepracuju. To dělám v db. PHP vlastně slouží jen pro zápis a výpis dat.

PS: Dokonce jsem tuhle zjistil, že v nějakých projektech jsem ani nenastavil internal_encoding na UTF, protože s těma datama tam normálně vůbec nic nedělám :-).

Komentáře

  • Kit : Jen pro inspiraci: Místo SafeValue() bych použil SafeInt(), SafeFloat(), SafeString() nebo třeba SafeDate() které se zároveň postarají o příslušné přetypování i limity hodnot. 21.11.2019
  • rmaslo : @Kit: jj. s tím souhlas. Ono MySQL je to celkem jedno, tam je všechno string. Ale jakmile se začne používat jiný DB driver, tak je potřeba vědět co je co. 21.11.2019
  • Taco : To je problém DB na kterou jsi zvyklej. Db má jen jednu úrovní kolekcí = tabulky, která obsahuje struktury = row, řádky. Dále se to nezanořuje. (Neřešme ref, enumy, etc.) *** Co když chceš udělat: pro uživatele s id=1, přidej mu článek, smaž článek s id=2, uprav článek s id=3 tak, že změníš title=nove, přidej (stále článek s id=3) komentář, smaž komentář s id=5, uprav u komentáře s id=6 id_autor=7, u komentáře s id=8 uprav u autora score=4,... ? *** uživatel má kolekci článků. Článek je Struktura, článek má title: String, autora: Struktura, komentáře: Kolekce. komentáře je Kolekce komentářů, kde jeden komentář je Struktura... A já mám právě problém s tím, že jednak musím vyfiltrovat správný článek, pak u něm upravit titulek (to je modifikace), a pak chci do jeho komentářů přidat novej komentář (což je taky modifikace, ale tak nějak jiná). 2.1.2020
  • rmaslo : @Taco: No, udělám ty změny postupně. Buď v transakci nebo ne, podle toho jak je potřeba. █ Jinak to jestli na ty data v db budeš koukat jako na tabulky nebo na vnořené struktury (které podle relací můžeš automaticky generovat) záleží jen na tobě. Souhlas, že já na ně koukám většinou jako na tabulky, protože je na stránce zobrazuji tabulkově. Kdyby uživatelé na stránce chtěli data editovat stylem "json" tak tam posílám struktury. Což někdy opravdu dělám, v případě tiskových výstupů, které neformátuji sám, ale které jdou do nějaké šablony a kolegovi chci poslat jen jeden zdroj dat. 21.11.2019

Pro zobrazení všech 2 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.