Kom ihåg mig?
Home Menu

Menu


Databasnormalisering av datum?

 
Ämnesverktyg Visningsalternativ
Oläst 2007-10-22, 13:53 #1
Frejs avatar
Frej Frej är inte uppkopplad
Flitig postare
 
Reg.datum: Jul 2004
Inlägg: 463
Frej Frej är inte uppkopplad
Flitig postare
Frejs avatar
 
Reg.datum: Jul 2004
Inlägg: 463
Normaliserar ni era datum?

Med en smalint (2 byte) kan man ju då få ~275 år.
Istället för en smaldatetime (4 byte) med 179 år.

Eller vad rekomenderar ni, håller på att sätta upp en databas
med normalisering i alla led, och började fundera lite över datum.
Frej är inte uppkopplad   Svara med citatSvara med citat
Oläst 2007-10-22, 14:29 #2
hnn hnn är inte uppkopplad
Banned
 
Reg.datum: Mar 2004
Inlägg: 2 587
hnn hnn är inte uppkopplad
Banned
 
Reg.datum: Mar 2004
Inlägg: 2 587
DATE typen
eller TIMESTAMP
hnn är inte uppkopplad   Svara med citatSvara med citat
Oläst 2007-10-22, 15:01 #3
martines avatar
martine martine är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Mar 2005
Inlägg: 767
martine martine är inte uppkopplad
Mycket flitig postare
martines avatar
 
Reg.datum: Mar 2005
Inlägg: 767
Citat:
Originally posted by Frej@Oct 22 2007, 13:53
Eller vad rekomenderar ni, håller på att sätta upp en databas
med normalisering i alla led, och började fundera lite över datum.
Det effektivaste är säkerligen att använda de inbyggda typerna (DATE etc) särskilt om man behöver göra sökningar på datum.

Skulle själv aldrig använda något annat än DATE eftersom det krånglar till hämtningar (SELECT) från databasen när man inte kan jämföra och hämta datum utan vidare (t.ex. med BETWEEN).
martine är inte uppkopplad   Svara med citatSvara med citat
Oläst 2007-10-22, 15:14 #4
Frejs avatar
Frej Frej är inte uppkopplad
Flitig postare
 
Reg.datum: Jul 2004
Inlägg: 463
Frej Frej är inte uppkopplad
Flitig postare
Frejs avatar
 
Reg.datum: Jul 2004
Inlägg: 463
Martine: Självklart kan man hämta och använda sig av Between även om man normaliserar data, man använder vyer för att skapa "tabeller" för att hämta datat man vill hantera. Förövrigt är det inte "best practice" att använda SELECT, INSERT, UPDATE eller DELETE direkt mot tabeller. SELECT skall köras mot Vyer och UPDATE, INSERT och DELETE skall köras mot lagrade procedurer.

Det jag undrar över är om man skall ha en tabell med en smalint (Identity) kolumn och en smaldatetime kolumn.
Sedan i övriga tabeller så refererar man till smalint värdet för att få tag i rätt datum. på detta vis så sparar man 2 byte för varje datum där det finns 3 eller fler av samma datum. Dock förlorar man 2 byte om datumet vara används en gång och blir ingen skillnad vid dubletter.

Hmm...
Jag har ju nästan svarat på detta själv. Alltså beror det på hur mycket samma datum kommer användas i min databas.

Jag undrar ändå, om någon annan normaliserar datum?
Frej är inte uppkopplad   Svara med citatSvara med citat
Oläst 2007-10-22, 18:16 #5
oller oller är inte uppkopplad
Medlem
 
Reg.datum: Mar 2004
Inlägg: 51
oller oller är inte uppkopplad
Medlem
 
Reg.datum: Mar 2004
Inlägg: 51
Nej. Skulle tippa att det är rätt så sällsynt.

Mvh
oller är inte uppkopplad   Svara med citatSvara med citat
Oläst 2007-10-22, 22:31 #6
SimonPs avatar
SimonP SimonP är inte uppkopplad
Mycket flitig postare
 
Reg.datum: May 2006
Inlägg: 832
SimonP SimonP är inte uppkopplad
Mycket flitig postare
SimonPs avatar
 
Reg.datum: May 2006
Inlägg: 832
Du kan tjäna några bytes men samtidigt ökar ju CPU belastningen lite eftersom det krävs extra anrop enbart för att lagra och hämta datum.
SimonP är inte uppkopplad   Svara med citatSvara med citat
Oläst 2007-10-23, 09:56 #7
Frejs avatar
Frej Frej är inte uppkopplad
Flitig postare
 
Reg.datum: Jul 2004
Inlägg: 463
Frej Frej är inte uppkopplad
Flitig postare
Frejs avatar
 
Reg.datum: Jul 2004
Inlägg: 463
SimonP: Lagringen kan jag hålla med om att det krävs ett extra anrop att få fram om Datumet redan existerar och returnera IDt eller om man skall skapa en ny rad för valt datum.

Men att det skulle ta mer CPU kraft att endast hämta datum vet jag inte. Då man kan fylla varje data page med fler rader så krävs färre läsningar av HDD huvudet vilket i sin tur medför bättre I/O prestanda. Och det är till 99.9% (ej fakta) HDD som begränsar I/O prestandand och inte CPUn.
Frej är inte uppkopplad   Svara med citatSvara med citat
Oläst 2007-10-23, 11:08 #8
SimonPs avatar
SimonP SimonP är inte uppkopplad
Mycket flitig postare
 
Reg.datum: May 2006
Inlägg: 832
SimonP SimonP är inte uppkopplad
Mycket flitig postare
SimonPs avatar
 
Reg.datum: May 2006
Inlägg: 832
Citat:
Originally posted by Frej@Oct 23 2007, 09:56
Men att det skulle ta mer CPU kraft att endast hämta datum vet jag inte. Då man kan fylla varje data page med fler rader så krävs färre läsningar av HDD huvudet vilket i sin tur medför bättre I/O prestanda. Och det är till 99.9% (ej fakta) HDD som begränsar I/O prestandand och inte CPUn.
Självklart tar det lite CPU, alla förfrågningar tar CPU, och ligger resultatet efter en SELECT fråga inte i cacheminnet ökar även I/O från hdd, precis som du skriver. Men cacheminnet gör att I/O-prestandan från HDD inte behöver vara avgörande jämt, ju mer RAM-minne ju mindre HDD I/O.
SimonP är inte uppkopplad   Svara med citatSvara med citat
Oläst 2007-10-23, 20:20 #9
Roberts avatar
Robert Robert är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Jan 2004
Inlägg: 2 103
Robert Robert är inte uppkopplad
Klarade millennium-buggen
Roberts avatar
 
Reg.datum: Jan 2004
Inlägg: 2 103
Personligen skulle jag inte försöka mig på normalisering på den här nivån. Det finns anledningar till att man tex inte bryter ut egennamn i separata tabeller, och datum.... tja, för att spara några bytes? Disk är billigt, en JOIN är dyr!

Det är lika dåligt att övernormalisera en databas som att inte alls normalisera. Mera aggregeringar till folket!

[edit: stavfel]
Robert är inte uppkopplad   Svara med citatSvara med citat
Oläst 2007-10-23, 22:55 #10
martines avatar
martine martine är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Mar 2005
Inlägg: 767
martine martine är inte uppkopplad
Mycket flitig postare
martines avatar
 
Reg.datum: Mar 2005
Inlägg: 767
Citat:
Originally posted by Frej@Oct 22 2007, 15:14
Martine: Självklart kan man hämta och använda sig av Between även om man normaliserar data, man använder vyer för att skapa "tabeller" för att hämta datat man vill hantera. Förövrigt är det inte "best practice" att använda SELECT, INSERT, UPDATE eller DELETE direkt mot tabeller. SELECT skall köras mot Vyer och UPDATE, INSERT och DELETE skall köras mot lagrade procedurer.
Nu är det möjligt att du är mycket bättre insatt i databaser men ger det verkligen alltid en prestandavinst att använda vyer och procedurer? Det är ju trots allt en omväg till informationen…

Den stora vinsten ligger väl antagligen i att använda rader av fast bredd och inte om det kostar 2 eller 3 bytes. För framtidssäkring känns det trots all säkrare att satsa på "enkla" lösningar och låta databasen sköta optimeringen. Det kan mycket väl hända att lyfta 4 bytes data från en tabell går snabbare än 2 bytes om du har en processor som kör med 64 bitar, med 2 bytes måste den då maska ut 32 bitar och skicka dem separat, medans 4 bytes kan skickas löpande.

"Supernormalisering" betyder ju inte alltid prestandavinst och för min del tycker jag frågan också är om man inte gör saker krånligare än vad är nödvändigt i optimeringssyfte.
martine är inte uppkopplad   Svara med citatSvara med citat
Svara


Aktiva användare som för närvarande tittar på det här ämnet: 1 (0 medlemmar och 1 gäster)
 

Regler för att posta
Du får inte posta nya ämnen
Du får inte posta svar
Du får inte posta bifogade filer
Du får inte redigera dina inlägg

BB-kod är
Smilies är
[IMG]-kod är
HTML-kod är av

Forumhopp


Alla tider är GMT +2. Klockan är nu 22:57.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson
 
Copyright © 2017