INT lub CHAR dla pola typu

19

Jaki jest najlepszy projekt dla stołu, Typepola z intlub char(1)? Innymi słowy, biorąc pod uwagę ten schemat:

create table Car
(
    Name varchar(100) not null,
    Description varchar(100) not null,
    VehType .... not null
)

Czy to jest bardziej wydajne (pod względem wydajności), VehTypeaby być an intlub char(1)? Powiedzmy, że masz pięć typów samochodów, czy powinieneś użyć wartości przyrostowych 0 -> 4 lub znaków dla tych typów (powiedzmy: „v”, „s”, „c”, „t”, „m”)?

Jeśli to coś więcej, użyłbym osobnej tabeli Type i miałbym relację klucza obcego, ale nie widzę takiej potrzeby.

Zauważam, że sys.objectswidok katalogu używa znaku dla typepola. Czy jest powód ku temu? Czy po prostu łapię tu powietrze i czy jest to coś, z czym czuję się bardziej komfortowo?

Thomas Stringer
źródło

Odpowiedzi:

20

Zazwyczaj używasz tinyint, który również ma 1 bajt

  • char (1) będzie nieco wolniejszy, ponieważ porównywanie używa sortowania

  • zamieszanie: co to jest S: SUV lub sedan lub sedan lub sport?

  • użycie litery ogranicza Cię w miarę dodawania kolejnych typów. Zobacz ostatni punkt.

  • każdy system, który widziałem, ma więcej niż jednego klienta, np. raportowanie. Logika zmiany V, S na „Van”, „SUV” itp. Będzie musiała zostać powtórzona. Użycie tabeli odnośników oznacza, że ​​jest to proste DOŁĄCZENIE

  • rozszerzalność: dodaj jeszcze jeden typ („F” dla „ Latającego samochodu ”), który możesz wstawić jeden wiersz do tabeli odnośników lub zmień wiele kodów i ograniczeń. A także kod twojego klienta, ponieważ to musi wiedzieć, czym są V, S, F itp

  • utrzymanie: logika jest w 3 miejscach: ograniczenie bazy danych, kod bazy danych i kod klienta. Za pomocą odnośnika i klucza obcego może znajdować się w jednym miejscu

Zaletą użycia pojedynczej litery ... eee, nie widzę żadnej

Uwaga: istnieje powiązane pytanie MySQL dotyczące Enums . Zaleca się użycie tam również tabeli odnośników.

gbn
źródło
2
świetne punkty. Zastanawiam się, dlaczego inni używają char (1) (jak sys.objects).
Thomas Stringer,
2
sys.objects ma spuściznę wracającą do Sybase i wczesnych wersji SQL Server en.wikipedia.org/wiki/Microsoft_SQL_Server#Genesis Jeśli spojrzysz na obiekty systemowe, możesz zobaczyć kody nie identyfikatory, ale mniej w nowych DMV. Co do innych ludzi oprócz stwardnienia rozsianego? Pomyśl o RDBMS, a nie OO / Enums i warto korzystać z odnośników.
gbn
1
ok zgadzam się. Dzięki za wyjaśnienie. Czy więc jest to dość dokładne stwierdzenie, że nie ma prawdziwej nadmiernej inżynierii z integralnością relacji i tabelami odnośników? Mam na myśli, że w przypadku przechowywania kilku rekordów w tabeli odnośników i odwoływania się do nich w tabeli konsumującej, czy poprzednie stwierdzenie byłoby dokładne?
Thomas Stringer,
1
@onedaywhen: To robi różnicę, jeśli spojrzysz na różne typy jako dane lub jako statyczny zestaw wartości, które nigdy się nie zmienią. Jeśli używasz tabeli typów, możesz po prostu dodać inny typ do tabeli bez potrzeby zmiany reguł biznesowych w bazie danych i aplikacji.
Guffa,
1
@ MichaelKjörling: Zgadza się, jeśli był to tylko klucz. Ale OP zamierza oznaczać coś takiego jak „v” lub „s”. Uwaga: nie chodzi o samoopisywanie i wypełnianie naturalnych kluczy, takich jak kody walut (EUR, USD, GBP, CHF itp.).
gbn
3

Tylko jako uzupełnienie odpowiedzi wielkiego GBB .

Może mógłbyś stworzyć coś takiego:

create table dbo.VehicleType
(
    VehicleTypeId int not null primary key,
    Name varchar(50) not null,
    Code char(3) null
) 
go 

create table Car
(
    Name varchar(100) not null,
    Description varchar(100) not null,
    VehTypeId int not null ,
    foreign key FKTypeOfCar(VehTypeId) referenctes dbo.VehicleType (VehicleTypeId) 
)
go 

Możesz więc robić z wyliczeniem, jak chcesz, zachowując integralność relacyjną (używając klucza obcego). Za pomocą codekolumny możesz dowolnie używać kodów char, dzięki czemu zostaną one udokumentowane w bazie danych (i możesz wyodrębnić informacje o kodzie bezpośrednio z DB, bez zawiłej transformacji kodu aplikacji w celu integracji systemów).

Fabricio Araujo
źródło
Czy chcesz zezwolić na nullkod?
Jack Douglas
Tak, kod jest opcjonalny, aby umożliwić reprezentowanie typu pojazdu, który nie jest jeszcze skodyfikowany.
Fabricio Araujo
Dlaczego ludzie lubią nadal usuwać komentarze? Jest dość denerwujące.
Fabricio Araujo
@FabricioAraujo - Jeśli komentarz jest przestarzały (np. „Zredaguję to w mojej odpowiedzi”, a następnie faktycznie to zrobisz), dobrze jest usunąć komentarze, które nie mają już zastosowania.
Nick Chammas
1
Sugerowałbym dodanie typu „Niesklasyfikowany” do tabeli typów i ustawienie wartości domyślnej pola VehicleTypeId na wartość niesklasyfikowaną, zamiast dopuszczania wartości pustej w polu klucza obcego. Zasadniczo złą praktyką jest nadawanie wartości zerowej ważnego znaczenia biznesowego.
Michael Blackburn,