Czy SQL Server 2008 ma typ danych, taki jak MySQL enum
?
Odpowiedzi:
Tak nie jest. Istnieje niejasny odpowiednik:
mycol VARCHAR(10) NOT NULL CHECK (mycol IN('Useful', 'Useless', 'Unknown'))
enum
), podczas gdy gdyby używały odwołania FK do tabeli, wówczas te rzekomo statyczne wpisy wyliczenia mogą być modyfikowane w czasie wykonywania, co byłoby niepożądane (a SQL Server nie obsługuje koncepcji niezmienne tabele), wreszcie, jeśli masz wiele wyliczeń z tylko kilkoma wartościami, w końcu dodasz wiele tabel do bazy danych. Nie wspominając o dodatkowych odczytach IO ze względu na sprawdzanie ograniczeń FK podczas wstawiania / usuwania danych, podczas gdy a CHECK CONSTRAINT
jest znacznie szybszy i nie powoduje spamowania obiektów bazy danych.
Najlepszym rozwiązaniem, jakie znalazłem w tym przypadku, jest utworzenie tabeli przeglądowej z możliwymi wartościami jako kluczem podstawowym i utworzenie klucza obcego do tabeli przeglądowej.
Tabele wyszukiwania IMHO to droga do zrobienia, z referencyjną integralnością. Ale tylko jeśli unikniesz „złych magicznych liczb”, postępując zgodnie z przykładem takim jak ten: Generowanie wyliczenia z tabeli wyszukiwania bazy danych przy użyciu T4
Baw się dobrze!
CREATE FUNCTION ActionState_Preassigned()
RETURNS tinyint
AS
BEGIN
RETURN 0
END
GO
CREATE FUNCTION ActionState_Unassigned()
RETURNS tinyint
AS
BEGIN
RETURN 1
END
-- etc...
Tam, gdzie liczy się wydajność, nadal używaj twardych wartości.
Znalazłem to interesujące podejście, gdy chciałem zaimplementować wyliczenia w SQL Server.
Podejście wymienione poniżej w linku jest dość przekonujące, biorąc pod uwagę, że wszystkie potrzeby wyliczeń bazy danych mogą być zaspokojone przy użyciu 2 tabel centralnych.