Czy są jakieś uzasadnione powody, by przechowywać datę i godzinę w osobnych kolumnach?

9

Staram się zrozumieć decyzję naszego dostawcy oprogramowania o zachowaniu daty i godziny w osobnych kolumnach. Na przykład, kiedy wiersz został utworzony lub zaktualizowany. Zarówno godzina, jak i data są kolumnami DateTime. Używamy SQL Server 2005.

Baza danych zawiera dane naszego systemu ERP i uważam, że największe tabele zawierają około ~ 3 milionów wierszy. Większość tabel zawiera około 100 000–1 000 000 wierszy.

Osobiście domyślnie wybrałbym pojedynczy DateTime dla pojedynczego znacznika czasu. Umożliwiłoby to łatwiejsze obliczanie różnicy czasu, a części daty i godziny można łatwo wyodrębnić ze znacznika czasu. Zużyłby również mniej miejsca.

Czy oddzielanie daty i godziny jest złym postępowaniem, czy też jest coś bardzo genialnego w tym projekcie, którego nie rozumiem?

miq
źródło

Odpowiedzi:

4

Domyślam się, że jest to starsza funkcja wsparcia (tj. W wersji 1 ich oprogramowania, mieli datę i godzinę w osobnych polach i zostali zmuszeni do obsługi, ponieważ zawsze działało w ten sposób).

To powiedziawszy, nie ma nic wspaniałego w oddzielaniu daty i godziny, więc nie brakuje niczego.

(Inną opcją jest to, że programiści systemów ERP nie wiedzieli, że pole daty i godziny może przechowywać datę i godzinę, ale o wiele bardziej prawdopodobne jest, że wymagali od firmy, aby działał tak samo jak poprzednie wersje).

Simon Righarts
źródło
4

Zasadniczo zależy to od użytkowania. Jeśli wiele zapytań łączy ze sobą podelementy, rozważ ich przechowywanie razem, a następnie nałóż na siebie konieczność dzielenia ich na mniejsze w rzadszych przypadkach. Oczywiście podział jest czasem bardziej złożony (lub niemożliwy): rozważ person_full_nameatrybut, z którego musisz wyodrębnić person_family_name. To powiedziawszy, rzucanie wartości czasowej jest trywialne, więc ogólnie wolałbym przechowywać datę i godzinę razem.

Rozważ także przechowywanie razem i oddzielnie, z ograniczeniami (i być może wyzwalaczami), aby upewnić się, że nie zsynchronizują się: w ten sposób możesz podjąć decyzję o podzieleniu / dołączeniu w momencie aktualizacji, a nie w momencie zapytania dane.

oneedaywhen
źródło
3

W systemie operacyjnym nie widzę dużego zastosowania tego. W systemie analitycznym może być potrzebny osobny wymiar daty z ziarenkiem „dni”, więc data łączy się ze zbiorczymi raportami dat, a być może kolumna „czas”, jeśli z jakiegoś powodu chcesz przeprowadzić analizę według pory dnia .

Możesz także przedstawić datę i godzinę jako kolumny obliczone na podstawie podstawowej kolumny daty i godziny.

ConcernedOfTunbridgeWells
źródło
0

Aby dodać do komentarza ConcernedOfTunbridgeWe, istnieje korzyść w zakresie wydajności zapytań, jeśli masz tabelę DateDimension i TimeDimension. Rozważmy, że tabela faktów zawiera zarówno dateDimensionKey, jak i TimeDimensionKey. Jeśli chcesz znaleźć numer czegoś między 8 rano a 5 po południu, możesz po prostu to zrobić

SELECT COUNT(1) FROM FactTable f Inner Join TimeDimension t on f.TimeDimensionKey = t.TimeDimension WHERE t.Hour BETWEEN 8 AND 17.

Jeśli masz indeks dodany do TimeDimensionKey, będziesz potrzebować tylko szukania indeksu dla wyniku w tabeli faktów w celu wyszukiwania danych

Bez tabeli TimeDimension będziesz musiał wykonać następujące czynności,

SELECT COUNT(1) FROM FactTable f WHERE DatePart(mintue, f.Date) BETWEEN 8 AND 17

Prawdopodobnie będzie to wymagać skanowania tabeli, ponieważ silnik bazy danych musi obliczyć wynik dla każdego wiersza, zanim będzie mógł dowiedzieć się, jakie dane mogą zostać zwrócone.

dsum
źródło