Listopad 10th, 2006MySQL 5.0 díl.1

Od verze 5.0 je možné využívat nových vlastností, které nabízí skutečnou správu dat v databázi.

Jednotlivé vlastnosti rozepíši do vlastních dílů.

V prvním díle se budu věnovat referenčním integritám. Referenční integritu bylo možné využívat již dříve. Respektive od doby, kdy MySQL podporovala typ tabulky InnoDB.

Proč vůbec databáze používá tuto vlastnost? Pokud začnu pracovat s daty v databázi, zjistím, že některé se přímo vážou na jiné. Dříve se používal způsob uchování těchto vazeb v aplikační úrovni. Nevýhody, které to sebou přinášelo je hned několik:
  • programátor musel stále mít v paměti, která data jsou propojena a podle toho provozoval akční dotazy
  • při změně aplikace nad databází se znovu musely tyto vazby naprogramovat
  • při provedení UPDATE se museli projít všechny vazby a upravit hodnoty
  • a tak dále…

Při použití referenčních integrit v MySQL tyto nepříjemnosti odpadnou.

Jak jsem již psal na začátku, pro využití referenčních integrit musíte použít takový typ tabulky, který danou vlastnost podporuje. Osobně jsem volil nejlepší možnou variantu a to InnoDB.

Lepší než další povídání bude malý příklad:

Mám tabulku uživatelů a tabulku návštěvnosti. Dejme tomu, že u návštěvnosti budu uchovávat informace o počtu návštěv za každý den.

CREATE TABLE uzivatele (
  login varchar(10) NOT NULL,
  heslo varchar(255) NOT NULL,
  jmeno varchar(100) NOT NULL,
  prijmeni varchar(100) NOT NULL,
  PRIMARY KEY(login)
)ENGINE=InnoDB;
CREATE TABLE uzivatele_nav­stevnost (
  uzivatel varchar(10) NOT NULL,
  datum date NOT NULL,
  pocet int NOT NULL DEFAULT ‚0‘,
  PRIMARY KEY(uzivatel, datum)
)ENGINE=InnoDB;

Vše se zdá být v pořádku. Ale co se stane ve chvíli, kdy některý uživatel změní login? Co se stane ve chvíli, kdy některého uživatele smažu? Nyní mám dvě možnosti, buď v aplikaci budu udržovat vztah uzivatele:login vs. uzivatele_nav­stevnost:uziva­tel nebo použiji referenční integritu.

ALTER TABLE uzivatele_nav­stevnost
ADD CONSTRAINT fk_uzivatel_u­zivatele
FOREIGN KEY(uzivatel) REFERENCES uzivatele(login)
ON UPDATE CASCADE ON DELETE RESTRICT;

Co jsem v podstatě udělal? Vytvořil jsem cizí klíč v tabulce uzivatele_nav­stevnost s nazvem fk_uzivatel_u­zivatele. Nyní, pokud provedu UPDATE loginu v tabulce uzivatele, změní se mi login uživatele i v tabulce uzivatele_nav­stevnost. Pokud se pokusím smazat uživatele z tabulky uzivatele, dotaz skončí s chybou. Důvodem je definování DELETE RESTRICT. Zde je jasné, že vlastnost pro DELETE přepíši na CASCADE.

Samotný význam referenčních integrit není usnadnit práci vývojářům při manipulaci s daty, ale udržet data ve správné formě. Vlastnosti pro UPDATE a DELETE pro cizí klíč jsou následující:
  • CASCADE – provede změny ve sloupci podle změny v referenčním sloupci
  • RESTRICT – znemožní upravit či smazat data
  • SET NULL – při nastaveni refenečního sloupce na NULL či smazání, nastaví se sloupec cizího klíče na NULL (zde samozřejmě je třeba, aby cizí klíč měl možnost obsahovat NULL)

Na předchozím příkladu jsem ukázal možnost vytvoření referenční integrity mezi dvěmi tabulkami, ale existuje možnost vytvoření takovéto integrity v zájmu jedné tabulky.

Příklad:

Budu mít tabulku zaměstnanců, která navíc obsahuje vztah nadřízený-podřízený.

CREATE TABLE zamestnanci (
  osobni_cislo int NOT NULL,
  jmeno varchar(100) NOT NULL,
  prijmeni varchar(100) NOT NULL,
  nadrizeny int DEFAULT NULL,
  PRIMARY KEY(osobni_cis­lo),
  CONSTRAINT fk_nadrizeny_za­mestnanci
  FOREIGN KEY(nadrizeny) REFERENCES zamestnanci(o­sobni_cislo)
  ON UPDATE CASCADE ON DELETE SET NULL
)ENGINE=InnoDB;

S definicí referenčních integrit navíc souvisí i správný návrh databáze. K tomuto problému lze říci jen jedno: mít zkušennosti.

V příštím díle se budu věnovat opět typu InnoDB a další vlastnosti a to transakčnímu zpracování.

Listopad 9th, 2006PHP 5.2

Tak nám vyšla nová verze PHP 5.2, která by měla vylepšit rychlost přímo v ZEND Engine.

Koukal jsem se na změny a je pravda, že pár věcí se zde pohlo k lepšímu. Otázkou však zůstává, zda se z toho paskvilu a neuspořádaného vývoje, v kterém se PHP ocitá dokáže ještě vymanit.

Microsoft sám začal mít o PHP zájem alespoň v podpoře .NET, ale jeden nikdy neví, kam to může zajít (InnoDB v MySQL vs. Oracle). Jsou zde opravené některé věci, jako např. v abstraktní třídě nemůže existovat statická metoda, magická metoda __toString() nemůže vyhazovat výjimku apod.

Ale co mě stále štve na PHP je ta ignorace type hinting, s tím související přetěžování metod či konstruktorů, dále vyhazování výjimek z php funkcí namísto stupidního Boolean, nemožnost smysluplně vytvořit Singleton, apod.

Pokud se podívám na způsob práce s databází, je často zdůrazněna dobrá podpora MySQL, ale k čemu mi je taková vynikající podpora, když zde nemám pořádný nástroj na ORM, DAO, apod. (např. Hibernate v Jave). Je zde sice jakýsi Propel, ale… Jako standard to bráno není a asi ani nikdy nebude. (Ono MySQL by samo potřebovalo opravit pár věcí, kterými se honosí verze 5. Alespoň integrace nějakého smysluplného jazyka pro psaní stored procedure. V tomto nynějším stavu je to na cvokárnu.) Jsem zvědavý jaké změny nám přinese PHP 6.0. Těším se zejména na věci jako definování návratových hodnot v metodách, přímou integraci s MySQL a s tím spojený jistý nárůst rychlosti.

Ale na druhou stranu zůstávám skeptický v tom, jestli se PHPko někdy pročistí a vzniknou frameworky, které budou standardem pro práci s danou vrstvou. Pokud ovšem PHP bude i nadále ignorovat type hinting, čistý oop model, zastaralé metody, způsob definování názvů metod, balíčkovací systém pro třídy, apod. tak nikdy nevzniknou frameworky, nikdy se nic nestane standardem a nikdy nebude ničím jiným než jazykem pro lamy :(


© 2007 finc weblog | iKon Wordpress Theme by Windows Vista Administration | Powered by Wordpress