koblingen objekter mot database
TRANSCRIPT
Introduksjon
• Varighet: 1 time
• Opplegg
• Foredrag
• Diskusjon om hva jeg har glemt og dere er uenig med meg i
2
Objekter -> databaser
•Problemområdet:
• Hvordan håndtere koblingen mellom objekter og database
•Database
• Lagring
• Forhold gjennom fremmednøkler
•Objekter
• Interaksjon
• Forhold gjennom referanser
• Arv, polymorfismse
3
Alternativer
•Manuell SQL
•Stored procedures/Views
•Dataset (Table data gateway)
•Active Record
•OR-mapper, egenutviklet
•OR-mapper, kommersiell/open source
•Kodegenerering
4
Persistance Ignorance
•Graden av kobling mellom databasen og objektene
• Arve fra spesifikk baseklasse
• Instansiere via bestemt factory
• Bruke spesielle datatyper
• Implementere interface
• Ha spesifikke konstruktører
• Ha spesifikke felt
• Access modifiers
• Annet
5
Manuell SQL
- Skrive SQL i kildekoden.
- Brukes gjerne med Dataset eller enkel form for OR-mapping
- Fordeler
- Raskt å lage
- Ulemper
- Uhåndterlig
- Skrive mye kode
- Ingen indikasjon til DBA om hva som går mot databasen
- SQL-injection
- Query plan caching
6
Stored procedures / Views
- SP/Views som aksess til databasen.
- Brukes gjerne med Dataset eller enkel form for OR-mapping
- Fordeler
- Lettere å få oversikt over hva som går mot basen enn med manuell SQL. Fint for DBA
- Velkjent
- Batch, rapporter osv.
- Abstraksjonslag
- Ytelse
- Sikkerhet
- Tuning
7
Stored procedures / Views
- Ulemper
- Kan være tungvindt å måtte spesifisere opp alt
- Business logikk
- Bytte database
- Forandringsfiendtlig
- Feilmeldinger/Debugging
- (Testing)
8
Dataset (Table data gateway)
- Fordeler
- Rapid Application Development støtte
- Veldig raskt å få opp
- Støtte igjennom hele rammeverket
- ”Microsoft-produkt”. Lett å få kunden med på
- Raskt å komme i gang med, alle kjenner det
9
Dataset (Table data gateway)
- Ulemper
- Skalerer veldig dårlig med kompleksitet
- Må leve med utility-klasser for funksjonalitet, ender fort opp med mye prosedurell kode
- Database-skjemaet lekker ned i hele systemet, ofte helt opp til GUI-bindinga
- Objektorientering
- Alt må castes (Blir lagret som object)
- Streng-basert spesifisering av kolonnenavn, både i uthenting til dataset, og i aksess mot datasettet
- Refaktorering kan være vanskelig
- Ofte også SQL i hele systemet, vanskeliggjør forandringer
10
Active Record
- Rad-objekt (entitet)
- med domenelogikk
- med kunnskap om egen lagring
- 1:1 mot databasetabell
11
Active Record
- Fordeler
- Lav terskel
- Ikke duplisert mapping som ved standard OR-mapper
- Mapping mot database i objektet. Oversiktlig
- Sentralisert kobling mot databasen i et lag
- Jobber alltid med entiteter. Automagiske spørringer mot basen
- Automatisert refaktorering til vanlig OR-mapping.
- Ulemper
- Fungerer godt med ukomplisert skjema (1:1)
- Data-centric
- Vanskelig for DBA med spørrings-tuning
- PI, Testing
13
OR-mapper• Automatisk mapping mellom database og objekter
• Bruker mapping-filer eller attributter
• Persistence Ignorance (PI)
14
OR-mapper
•Fordeler
• Modellert domene godt – domain-centric
• Dynamisk SQL-generering
• Støtte for multiple-databaser
• Støtte for stored procedures og manuell sql
• Rask utviklingstid når det er oppe, lett å forandre
•Ulemper
• Kompleksitet
• Ytelse
15
OR-mapper, med mappingfiler
- Fordeler
- Separert objekt-design
- Støtter mer avanserte scenarioer enn Active Record
- Sentralisert kobling mot databasen i et lag
- Jobber alltid med entiteter. Selve mappingen mot databasen er automagisk
- Ulemper
- Må duplisere objektnavn, propertynavn osv. i mappingfiler
- XML og ren tekst (Hjelper med GUI-støtte, andre hjelpemidler)
- Vanskelig for DBA med spørrings-tuning
16
OR-mapper, egenlaget
- Fordeler
- Egen funksjonalitet / videreutvikling
- Debugging
- Kunden vet at alt som påvirker løsningen er internt
- Kult for den som gjør det
- Ulemper
- Tar mye tid
- Finne opp kruttet på nytt
- Ingen nye vil ha kunnskap om løsningen
- Ingen gratis videreutvikling / testing
18
OR-mapper, komm./open source
- Fordeler
- Relativt kort oppstartstid
- Installasjon og forståelse
- Avansert funksjonalitet
- Testet i (forhåpentligvis) utallige prosjekter og scenarioer
- Gratis videreutvikling og feilfiksing
- Nye kan potensielt kjenne løsningen
- Brukergruppe med kunnskap rundt bruk
19
OR-mapper, komm./open source
- Ulemper
- Tar mye tid
- Ikke debugge ved feil
- Begrenset av produktets grenser
- Lærekurve
- Ikke-Microsoft kan være problematisk å overbevise kunde om
- Hva om produktet slutter å utvikles?
20
Kodegenerering
•Generere data access og domeneobjekter fra databasen
•Kjenner det ikke godt nok
•Fordeler
• Nært til databasen
• Avansert generering
•Ulemper
• Data-centric
• Mange av de samme som OR-mapper ifh. til kompleksitet/ytelse osv.
21
NHibernate• Mest kjente og voksne
• Port fra Hibernate, levd i Java-verden i en evighet
• Stor brukerskare
• Domain-centric
• Mye funksjonalitet
• Mappingfiler
• Arv
• Eget query språk
• Støtte for Stored procedures
• 1-1, 1-*, *-*
• Caching
• Støtter flere databaser
• LINQ
• Persistance Ignorance (PI)
• ER OR-mapperen i .NET verden per nå
23
Entity Framework
•MSDN: ”designed to provide strongly typed LINQ access for applications requring a more flexible object-relational mapping, across Micorsoft SQL Server and third-party databases”
•Enterprise løsning
•Flere lag med metadata – Conceptual, Storage, Mapping
•Skal være mer enn en OR-mapper
•MEN
• Veldig dårlig i forhold til Persistence Ignorance
• Ikke veldig modent (v1)
24
LINQ to SQL
•Rapid Application Development løsning
•Støtter kun direkte mapping mot databasen. 1:1
•MSDN: ”designed to provide strongly typed LINQ access for rapidly developed applications across the Mircrosoft SQL Server family of databases.”
•Kun Table per Hierarchy arv
•Kun attributt-mapping ved bruk av Visual Studio 08 designer
•Kun SQL Server
25
Castle Active Record
•Fordeler
• Veldig enkelt å komme i gang med
• Laget over NHibernate
• Må ikke spesifisere kolonnenavn
•Ulemper
• Standard problemer rundt PI for AR
• Vanlig å arve fra baseklasse
• Data-centric
• 1:1
26
Konklusjon
• Ingen løsning passer alle scenarioer!
•Velg ut i fra
• Hva du skal utvikle
• Hvordan du liker å utvikle
• Hva du kan
• Hva de andre utviklerne kan!
29