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?
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.
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.
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.