Avatar billede teutebod Nybegynder
01. november 2005 - 10:42 Der er 7 kommentarer

Logik på sql serveren eller i applikationen?

Jeg har en tabel med kolonnerne: ID, NogetText, StatusBit. Det er en tabel der bliver tilføjet en række til ca. engang om dagen.

I min applikation vil jeg gerne lave en liste som viser alle de poster hvor StatusBit = true, og hvis der er færre en 50 records, så skal jeg bare fylde ud med poster hvor StatusBit = false til jeg har 50 poster i alt i listen.

Normalt vil jeg bare lave noget SQL der henter dette ud, og knalde en datareader på repeateren. Men nu har jeg denne gang faktisk lavet nogle business entities og collections til at repræsenterer disse ting, og så bliver jeg i tvivl over hvor "logikken" til at bygge denne liste op bør ligge.

Som jeg ser det har jeg disse muligheder, og ved ikke helt hvad der er bedst:
1: Lav en sproc med dynamisk SQL som klare jobbet, og udfylder min collection fra en datareader som bruger denne sproc.

2: Lav en sproc der outputter to forespørgelser, en der henter alle hvor StatusBit = true, og en der henter en TOP 50 af dem hvor StatusBit = false. Så udfylder jeg min collection først med data fra først resultset, og derefter med data fra næste, indtil jeg rammer de magiske 50 records.

3: Hente alle records fra tabellen, og udfyld collectionen med de 50 records inde i applikationen.

Som jeg ser ulemperne:
1: Dynamisk SQL bliver tit omtalt som skidt praksis, med mindre der ikke er andre udveje. Og der er vidst nogle kloge hoveder der vil sige det også er skidt at have logik i databasen.

2: Splittet logik i applikationen og databasen, jeg vil skulle rette begge steder hvis jeg skal lave det om til en top 100 liste i stedet.

3: I det mindste ligger logikken kun i applikationen, men man henter en masse data der ikke skal bruges alligevel.


Hvad vælger de kloge folk, eller er der andre udveje? Og ville løsningen være anderledes hvis nu denne tabel blev opdateret med 100 records om dagen?
Avatar billede arne_v Ekspert
01. november 2005 - 10:48 #1
kan det ikke gøres med en enkelt SQL uanset hvad ?

og så:

præsentations lag-----data lag

hvor data laget sender en collection (ArrayList eller en type safe) af
objekter af en data klasse med 3 properties over til præsentations laget

jeg kan ikke lige se behovet for en stored procedure
Avatar billede dr_chaos Nybegynder
01. november 2005 - 10:56 #2
personligt ville jeg bruge en SP.
hvor du først laver en count på poster med statusbit = true
hvis tallet er over 50 udfører du den standard sql og returnerer de poster med statusbit = true.
ellers
henter du de poster ud med statusbit = true og laver en Top50-count(kolonner med statusbit = true) til at hente resterende kolonner.
Du har selvfølgelig gem din første count i en variabel.
den anden af den stored procedure laves som en union mellem 2 sqlsætninger.
Avatar billede erikjacobsen Ekspert
01. november 2005 - 11:02 #3
Er det ikke bare een SQL-sætning:

  SELECT TOP 50 .... ORDER BY status DESC,andrefelter

(enten ASC eller DESC, så du får true øverst - jeg husker det ikke)
Avatar billede teutebod Nybegynder
01. november 2005 - 11:09 #4
Nu fik jeg vist simplificeret det lidt for meget. Det er ikke bare en bit, men en integer der relaterer til en anden tabel. Ud fra denne relation har posterne en prioritet i denne liste, desværre er disse tal ikke sat op så jeg kan klare det med en simpel "order by". Jeg er ret sikker på at jeg ikke komme uden om at bygge SQL string op, for at få hentet kun den data jeg skal bruge.
Jeg er dog ikke sikker på hvor meget performance tab der er ved det, hvis det overhoved er noget at snakke om. Men normalt bliver man bare frarådet det.
Avatar billede arne_v Ekspert
01. november 2005 - 23:09 #5
SQLServer dialekten (T-SQL) er faktisk ret kraftfuld, så jeg har svært ved
at tro at det ikke kan gøres med en SELECT

og jeg forstår slet ikke behovet for hverken dynamisk SQL eller stored procedure

jeg tror at vi mangler nogle brikker til puslespillet
Avatar billede erikjacobsen Ekspert
01. november 2005 - 23:21 #6
11:09:49: en join kan også mange ting.
Avatar billede dr_chaos Nybegynder
04. februar 2006 - 16:43 #7
Du mangler at lukke spørgsmålet.
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
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

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