14. november 2007 - 21:24Der er
14 kommentarer og 2 løsninger
5 DB spørgsmål til eksperterne
Hejsa...
Jeg har en MS SQL 2005 og har dertil følgende spørgsmål:
1. Jeg ønsker at reg. en forum log...idet det jo er meget forskelligt hvor lange indlæg div. brugere skriver, hvordan vil det så være smartest at lagrer disse data...?
Skal man fx tjekke på længende af indlægget og derefter skrive det til den tabel hvis felt størrelse passer bedst?
eller findes der en smartere metode? Man kan jo også højst skrive 8000 nvarchar i et DB felt ik?
2. Hvordan er det nu man laver bedst indeksering på ens database? Jeg bruger SSMSE 2005 til at arbejde med min database...jeg tænker på...jeg def. fx. en primær nøgle på alle mine tabeller...men hvordan hvad med ForreinKeys? Kan man gøre andet for at tingene bliver mere optimeret mht. performance? Når man fx. laver select statements? Eller er det bare at lave sine join mv. korrekt?
3. Databasen ligger hos et hosting selvskab...er der noget man selv kan gøre for at optimere sikkerheden yderligere imod angreb mv.?
4. Kender i et tool til at generere SP (Stored Procedures) hurtigt via at grafisk værktøj? Ved godt at man kan lave standard SP ved hjælp af SSMSE men når man skal lave specifikke statements men IN/OUT parametre mv. kan det godt tage en del tid! Det var bare et oplagt program at lave, det ville alle jo bruge! I hvert fald mig! :)
5. Et tool til at lave komplet backup af en ekstern database lokalt....det må da også findes?
De oplagte loesninger maa vaere: * et felt NVARCHAR(4000) og bed folk fatte sig i korthed ! * et felt NTEXT and that is it * to felter - et NVARCHAR(4000) og et NTEXT som kun bruges til tegn 4001- for meget lange tekster
#1 duer nok ikke.
#2 er simplest og vil derfor normalt kunne anbefales.
#3 vil nok performe lidt bedre, hvis de fleste tekster er under 4000 tegn.
1. Hvad er det nu NTEXT står for? og hvad er grænsen på denne type?
2. Jeg bruger aspnet_Users tabellen - brugernes UserId findes også i alle andre tabeller som et felt, som har relation til brugeren. Vil det så hjælpe på performance at oprette "relationships" imellem tabellen aspnet_Users's felt "UserId" og alle de tabeller som reelt har en relation til tabellen?
3. Her tænkte jeg på at beskytte selve databasen imod ondsindet angreb.
Jeg er nu langt fra enig med at mange tabeller ikke kan betale sig, jeg mener netop at ved at distribuere sine data lidt ud vil man opnå flere fordele, dels på sikkerheden, men også på performance. Med sikkerheden tænker jeg på backup/ restore og performance ved opslag i flere tabeller evt. horisontal partitionering på SQL2005.
Det er selvfølgelig noget sværere at styre flere tabeller, men jeg vil mene skalérbarheden vil overskygge dette, men igen.. det kommer helt an på behovet.
En mulighed kunne være at oprette ntextfelter har kan have ligeså store indlæg som muligt og oprette fulltextindexering(FTI) på indholdet. Jeg formoder du gerne vil have svartider der sparker røv og så er FTI altså vejen frem. Hvis du skulle lave en nogenlunde fleksibel søgning via normale where clauses, ville du typisk skrive: select * from table where '%søgeord%' og det er netop den wildcard i begge ender der dræber databasen (index tages ikke i brug på sådan en svend) og hvis du så ovenikøbet også vil lave en søgning der hedder "pesto and pizza" altså med AND, så skal du til at bygge din where-clause yderligere op.. GABBBB og vi ender i det nye år med sådan en forespørgsel *GG*
Ja du har fat i sagen der med primary-foreign keys, god indexering på den slags felter vil forbedre performance. Du kigger på indexeringen af disse efter du har lavet dit tabeldesign og ligesom kender de joins der anvendes. oftest er primary keys allerede clustered så der får du lidt forærende.. (lang snak og et helt andet emne og ja man kan gøre mange andre ting for at opnå god performance)
Du skal altid lave dine joins korrekt, en tommelfingerregel siger at hvis du bruger distinct over på dine joins er dine joins kandidater til yderligere gennemgang og normalisering/ denormalisering - den slags finder du ud af under datamodelleringen (husk at starte med det konceptuelle først)
Du skal forlange af dit hostingselskab at sikkerheden skal være i top og ligeledes kende til deres ansvar og erstatningspligt hvis noget går i stykker. Husk også at kende til backup-frekvensen osv.
Jeg tror ikke der findes noget værktøj til SP's, en SP indeholder jo ofte specifik businesslogic, næh... det er kun de simpleste select, insert, update, delete der kan autogenereres - bare klø på, når du sidder og skriver SP's lærer du også designet at kende og kommer helt sikkert i tanke om andre måder at designe det på :)
Det der tool der... det er svært hvis der ikke er trust imellem domænerne, du kunne evt. bede hostingselskabet om at få lagt backuppen på dit domæne og så selv ftp'e den til et sikkert sted!
Og de andre spørgsmål der.. nvarchar-felter kan du højst gemme 4000 chars i, varchar 8000 (ca. tal)
At du indexerer aspnet_users tabellen er totalt ligegyldigt, ihvertfald hvis du har under tjaa... jeg vil gætte på 50.000 users, måske 100.000 svært lige at sige, men i små tabeller vil queryoptimizeren oftest vælge tablescan fordi et index måske vil være langsommmere at slå op i.
okay gutter! I skal have mange tak for de mange ord - håber at eksperten også bruger NTEXT ;)
Læg begge et svar! Så får Arne 50 points og Janus 100 points...
btw...det findes ikke nogen skudsikker måde at skjule postback data på vel...ja altså for brugeren ikke for selve browseren :) Altså en måde at deaktivere "View source code"?
neoman: Kiggde lidt i TSQL-dokumentationen (for 2005). Dit link siger at VARCHAR(MAX), NVARCHAR(MAX) og VARBINARY(MAX) vil erstatte TEXT, NTEXT and IMAGE. I min dokumentation er de "ny" typer alle nogle skravlede nogle, der kun kan indeholde hhv. 8000, 4000 og 8000 bytes - men det er der måske ændret på med "max"?
Skriver man virkelig "add test varbinary(max)"? Det skal nok sætte nogle SQL managere tilbage at man pludselig skal tillade bogstaver i et talfelt.
Variable-length, non-Unicode character data. n can be a value from 1 through 8,000. max indicates that the maximum storage size is 2^31-1 bytes. The storage size is the actual length of data entered + 2 bytes. The data entered can be 0 characters in length.
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.