LightSwitch – Rad sa relacijama između tabela

U prethodnom blog postu smo detaljno objasnili rad sa tabelama, tačnije kako se kreira tabela kao i ostale funkcionalnosti vezane za tabelu.

Ostale teme u seriji za LightSwitch:

Da bi uspješno završili model baze podataka potrebno je da kreiramo veze (relationships) između tabela.  U ovom tekstu se nećemo osvrtati na teoriju relacionog modela pri čemu bi u projektovanju trebalo voditi računa o normalnim formama nego ćemo se osvrnuti na mogućnosti koje LightSwitch pruža prilikom modelovanja sistema.

Tipovi veza koje je moguće ostvariti u LightSwitch:

  • one to many
  • zero or one to many
  • veza između tabela koje pripadaju različitim Datasource (različit izvor podataka)

Tipovi veza koje nije moguće ostvariti u LightSwitch dizajneru tabela su:

    • one to one
    • many to many (u daljem tekstu ćemo objasniti kako ostvariti ovu vezu uz pomoć vezne tabele)
    • zero or one to zero or one

JEDAN PREMA VIŠE (ONE TO MANY)

Najčešće upotrebljavana veza je jedan prema više ili obrnuto (više prema jedan) u zavisnosti sa koje strane se posmatra ova veza. Kao primjer ćemo kreirati vezu između tabele Pacijent (Patient) i Recepti (Prescription) iz primjera VisionClinic. Veza se dodaje tako što kliknemo na dugme Add Relationship u okviru dizajnera tabele kada se u dizajneru tabele nalazi prikazana tabela Pacijent:

Add relationship

Kada se pojavi dijalog za odabir parametara potrebno je definisati sa kojom se tabelom vrši povezivanje u polju Name-To.

AddNewRelatioship0

Nakon odabira tabele Patient LightSwitch automatski nudi vrijednosti za ostale parametre. Tip veze predstavlja način povezivanja dvije tabele ili kardinalnost veze. Praktično, sa ovom vezom smo definisali dva pravila:

  • Pacijent može imati više recepata (A Patient can have many Prescription instances)
  • Recept mora biti izdat za pacijenta (A Prescription must have a Patient) tj. konkretni recept nema smisla da postoji a da nije prepisan za konkretnog pacijenta

AddNewRelatioship

Moguće vrijednosti za kardinalnost veze između tabela su:

  • One
  • Zero or one
  • Many

U okviru dizajnera veze moguće je definisati sledeće parametre:

  • On Delete Behavior– ponašanje prilikom brisanja – predstavlja način ponašanja programa prilikom brisanja podataka.
    • Restricted – Pacijent (instanca tačnije konkretni pacijent) neće biti moguće obrisati ukoliko postoji i jedan recept koji je vezan za tog konkretnog pacijenta
    • Cascade Delete – Kada se pacijent obriše, LightSwitch će obrisati sve recepte koji su vezani za konkretnog pacijenta
  • Navigation Property – prestavlja naziv polja koji će biti kreiran u svakoj od tabele koje povezujemo kako bi se uopšte ostvarila veza. Dakle, vidjećemo na sledećoj slici da je povezivanjem tabela u u tabeli Prescription kreirano polje Patient sa tipom entiteta Patient:

PatientTable

Sa strane tabele Patient imamo sledeću situaciju:

Patient

Primijetićete da je kreirano polje Prescriptions sa tipom Prescription Collection. Zašto Collection? Lightswitch koristi Entity Framework ispod haube te se Prescription Collection ponaša kao Entitiy Framework EntityCollection. Iz istog razloga se Navigation Property ponaša kao paralela sa konceptom iz Entity Framework i Navitation Properties.

NIJEDAN ILI JEDAN PREMA VIŠE (ZERO OR ONE TO MANY)

Ovaj tip veze u odnosu na prethodni samo proširuje način povezivanja tj. to je tip veze koji bi praktično bio primjenjiv na slučaju veze recimo filmske kopije filma (npr. DVD) i člana videoteke (Member):

image

Za razliku od veze jedan prema više, u ovom slučaju DVD kopija ne mora biti izdata u jednom trenutku ni jednom članu te otud oznaka za kardinalnost veze 0..1. Dakle, DVD može biti vezan za jednog člana (kardinalnost 1) ali ne mora ni za jednog (kardinalnost 0) .

U ovom slučaju pored Restricted i Cascade Delete pojavljuje se i mogućnost treće vrste ponašanja prilikom brisanja: Disassociate.  Ona ima značenje da kada se briše instanca tabele Member tj. jedan konkretni član da se referenca u tabeli Member ka DVD postavi na null vrijednost.

Ovim različitim ponašanjem brisanja se obezbjeđuje referencijalni integritet baze kako se ne bi desilo da se brisanjem određenih podataka poremeti veza ka drugim tabelama. Tačnije, bilo bi baš nelogično da je moguće obrisati konkretnog pacijenta iz baze ukoliko za datog paijenta postoji bar jedan prepisani recept. Tada bi se desilo, kada se ne bi koristio način očuvanja integriteta, da postoji recept koji nije vezan ni za jednog pacijenta a tipom veze smo definisali da je to nemoguće tj. recept mora biti vezan za pacijenta.

VIŠE PREMA VIŠE (MANY TO MANY)

Kako mnoge poslovne aplikacije zahtjevaju vezu više prema više koristićemo metodu kreiranja pomoćne vezne tabele kako bi ostvarili željenu vezu. Ova veza bi npr. bila između žanra i filma sa značenjem da film može imati više žanrova i da svaki žanr može biti vezan za više filmova. Da bi ostvarili vezu više prema više potrebno je da kreiramo veznu tabelu FilmŽanr (MovieGanre) koji će samo sadržati polja koji predstavljaju referencu na tabele film i žanr. A svaka pojedinačna veza između Genre i MovieGenre kao i veza između Movie i MovieGenre predstavlja jednu vezu više prema jedan kao na slici:

image

VEZA IZMEĐU TABELA KOJE PRIPADAJU RAZLIČITIM DATASOURCE

LightSwitch omogućava da se kao izvor podataka iskoristi tabela/tabele iz druge baze podataka. Ono što je veoma zgodno u cijeloj priči je da je moguće izvršiti postavljanje veza između tabela koje se nalaze u različitim bazama s tim da postoje određena ograničenja. Veza između ovih tabela je prikazana isprekidanim crtama čime se označava da nije moguće ostvariti referencijalni integritet putem ove veze jer nemamo kontrolu nad tabelama koje se nalaze u drugoj bazi. Takođe se može primijetiti da nije moguće mijenjati ponašanje prilikom brisanja što potvrđuje pomenutu činjenicu o očuvanju referencijalnog integriteta tačnije o nemogućnosti ostvarenja integriteta. Kako se tabela ProductRebate nalazi u drugoj bazi kreira se polje u tabeli Prescription sa nazivom ProductRebate_ProductRebateID za polje ProductRebateId.

RelationshipAcross

Sa ovim smo definisali sve vrste veza koje je moguće ostvariti u okviru Microsoft LightSwitch Beta 2. Sledeće što je moguće uraditi je kreiranje ekrana za manipulaciju sa podacima u narednom blog postu u seriji posvećenoj LightSwitch-u.

About Spaso Lazarevic

Spaso Lazarevic is Senior Software Developer working with Microsoft technologies. Leader of .NET User Group Bijeljina, speaker at Microsoft events, writter and blogger. Microsoft MVP for Visual C#.
This entry was posted in Programming and tagged . Bookmark the permalink.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s