Avatar billede idiotbarn Nybegynder
18. august 2009 - 21:25 Der er 7 kommentarer og
1 løsning

Designpatterns, sql queries

Hej
Jeg sidder af og til med en lettere kompliceret sql query til at hente data ud af databasen (lettere kompliceret kan også bare være en enkelt join ) som jeg skal bruge flere forskellige steder, men med små ændringer. Det kunne fx være en query der henter flere rækker ud, hvor jeg også har brug for at kun at hente én enkelt række ud, baseret på ID'en.

Jeg leder lidt efter en smart måde at gøre strukturere mine programmer på så jeg har mindst muligt redundant sqlkode på en smart måde. Normalt plejer jeg at programmere efter n-tier modellen så jeg har nogen business objekter, et datalag o.s.v.

På nuværende tidspunkt har jeg forsøgt mig med at gøre en sql kommando til et objekt der har forskellige egenskaber, som returnere en sql query som streng. Det gør dog at sql koden bliver ret rodet, når der kommer flere egenskaber som fx:
"Select a,b,c"+SettingA==true ? "x" : "y" ...

Jeg frygter lidt at det bliver noget værre rod at vedligeholde. Ellers har jeg overvejet at putte base sql strengen i en abstrakt klasse, sammen med abstrakte metoder således at hvis man nedarver fra den kan man fx indsætte flere regler i Where delen af sql'en.

Har i nogen kommentar til ovenstående, og muligvis en bedre måde at gøre det på?
Avatar billede arne_v Ekspert
18. august 2009 - 21:57 #1
Du har naturligvis overvejet at droppe SQL helt og bruge en O/R mapper ikke?

Men hvis vi antager at du vil bruge SQL saa:

* brug af parameters / prepared statement er mandatory

* jeg ville nok ikke lave et objekt hiraki men noejes med at have en utility metode som tager et array/collection af feltnavn+value som argument og konstruerer en SQL ud fra det
Avatar billede idiotbarn Nybegynder
19. august 2009 - 09:39 #2
Jeg har overvejet en O/R mapper, men jeg kender dem ikke så godt. Jeg har fået forståelsen af at de virker 1:1 i forhold til db tabel data og objekt data. Kan jeg lave nedenstående med en O/R mapper:

Databasen består af 3 tabeller Tekst, Billeder og Kommentare. Hver post i Tekst har 0-n poster i Billeder og i Kommentare. Ved hjælp af Tekst.Id kan jeg hente de tilhørende billeder og kommentare ud. Jeg skal gerne kunne:
1) Hente Poster ud fra Tekst incl antallet af tilhørende billeder og kommentare
2) Hente poster ud fra tekst der har mindst ét billede eller kommentar

Hvis jeg bruger en O/R mapper til 2) skal jeg så vidt jeg har forstået først hente Tekst posterne ud, løbe dem igennem for at tælle antallet af billeder, og sortere i dem for at få dem jeg vil ha? Eller er jeg forkert på den?
Avatar billede arne_v Ekspert
22. august 2009 - 04:21 #3
Gode O/R mappere kan sagtens klare JOIN's.

Så dit Tekst objekt indeholder en collection af Billed objekter og en collection af Kommentar objekter.

Og når du loader dit Tekst objekt loades de collections også.

Antal billeder og kommentarer kan så nemt findes som størelsen af deres collections.

Gode O/R mappere har en feature så du kan hente en collection af objekter baseret på nogle WHERE betingelser.

Så også #2 bør kunne lade sig gøre.
Avatar billede idiotbarn Nybegynder
23. august 2009 - 21:21 #4
Ok tak. Så skal jeg ha kigget lidt mere på dem. Har du erfaringer med nogen du kan anbefale?
Avatar billede arne_v Ekspert
24. august 2009 - 03:49 #5
Hvilket sprog?
Avatar billede idiotbarn Nybegynder
25. august 2009 - 12:37 #6
C#
Avatar billede arne_v Ekspert
25. august 2009 - 15:09 #7
Jeg kender NHibernate - det virker fint.

MS lverer selv Entity Framework (hvis man er paa nyeste .NET version) og det er selvfoelgelig ogsaa vaerd at overveje.
Avatar billede arne_v Ekspert
13. september 2009 - 02:36 #8
OK ?
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester