Tür Alanı için INT veya CHAR


19

Bir tablo veya Typealan için en iyi tasarım hangisidir? Başka bir deyişle, bu şema göz önüne alındığında:intchar(1)

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

A veya a VehTypeolmak daha verimli (performans açısından) mı? Beş tür aracınız olduğunu varsayalım, 0 -> 4 artan değerlerini veya türler için karakterleri mi kullanmalısınız (örneğin; 'v', 's', 'c', 't', 'm')?intchar(1)

Bundan daha fazlası varsa, ayrı bir Type tablosu kullanır ve yabancı anahtar ilişkim olur, ancak buna ihtiyaç duymuyorum.

sys.objectsKatalog görünümünün alan için bir karakter kullandığını fark ettim type. Bunun bir sebebi var mı? Burada sadece ince havada tutuyor muyum ve daha rahat olduğum şey bu mu?

Yanıtlar:


20

Genellikle 1 bayt olan tinyint kullanırsınız

  • char (1) biraz daha yavaş olacaktır, çünkü karşılaştırma harmanlamayı kullanır

  • karışıklık: S: SUV veya Sedan veya Sedan veya Spor nedir?

  • bir harf kullanmak daha fazla tür ekledikçe sizi sınırlar. Son noktaya bakın.

  • gördüğüm her sistemin birden fazla müşterisi var, örneğin raporlama. V, S'yi "Van", "SUV" vb. Olarak değiştirme mantığı tekrarlanmalıdır. Bir arama tablosu kullanmak, basit bir birleşim anlamına gelir

  • genişletilebilirlik: bir tür daha ekleyin (" Uçan araba " için "F" ) bir arama tablosuna bir satır veya çok sayıda kod ve kısıtlamayı değiştirebilirsiniz. Ve müşteri kodunuz da V, S, F vb.

  • bakım: mantık 3 yerde bulunur: veritabanı kısıtlaması, veritabanı kodu ve istemci kodu. Bir arama ve yabancı anahtarla, tek bir yerde olabilir

Tek bir harf kullanmanın artı tarafında ... er, hiç görmüyorum

Not: Numaralandırmalar ile ilgili bir MySQL sorusu vardır . Tavsiye orada da bir arama tablosu kullanmaktır.


2
harika noktalar. Başkalarının neden char (1) (sys.objects gibi) kullandığını merak ediyor.
Thomas Stringer

2
sys.objects Sybase ve SQL Server erken sürümleri geri miras var en.wikipedia.org/wiki/Microsoft_SQL_Server#Genesis Sistem nesnelerine bakarsanız, kodları her yerde değil, yeni DMV'lerde görebilirsiniz. MS dışındaki diğer milletlere gelince? OO / Enums değil RDBMS'yi düşünün ve Lookups kullanmak mantıklıdır.
gbn

1
tamam, katılıyorum. Bunu açıkça belirttiğiniz için teşekkürler. Peki ilişkisel bütünlük ve arama tabloları ile gerçek bir aşırı mühendislik olmadığı oldukça doğru bir ifade mi? Demek istediğim, bu durumda bir arama tablosunda bir avuç kayıt saklamak ve bunları tüketen bir tabloya yönlendirmekle, önceki ifade doğru olur mu?
Thomas Stringer

1
@onedaywhen: Farklı türlere veri veya hiç değişmeyecek statik değerler kümesi olarak bakmanız fark eder. Bir yazı tablosu kullanıyorsanız, veritabanındaki ve uygulamadaki iş kurallarını değiştirmeye gerek kalmadan tabloya başka bir tür ekleyebilirsiniz.
Guffa

1
@ MichaelKjörling: Doğru, eğer sadece bir anahtar olsaydı . Ancak OP, "v" veya "s" gibi bir şey ifade etmeyi amaçlıyor. Not: Para birimi kodları (EUR, USD, GBP, CHF vb.) Gibi kendi kendini tanımlama ve eksiksiz doğal anahtarlar hakkında değiliz.
gbn

3

Tıpkı büyük gbn'nin cevabını tamamlayıcı olarak .

Belki böyle bir şey yaratabilirsiniz:

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 

Böylece ilişkisel bütünlüğü korurken (yabancı bir anahtar kullanarak) enum ile istediğiniz gibi yapabilirsiniz. İle codebu veritabanı üzerinde belgelenmiş olacak böylece sütununda sen at will karakter kodları kullanabilirsiniz (ve bir sistem entegrasyonu için uygulama kodu üzerinde dolambaçlı dönüşüm olmadan, DB'den doğrudan kod bilgisi çıkarabilir).


Bir nullkoda izin vermek mi istiyorsun ?
Jack Douglas

Evet, henüz kodlanmamış bir araç tipini temsil etmek için kod isteğe bağlıdır.
Fabricio Araujo

İnsanlar neden yorumları silmeye devam ediyor? Oldukça sinir bozucu.
Fabricio Araujo

@FabricioAraujo - Bir yorum eskiyse (örn. "Bunu cevabımda düzenleyeceğim" ve sonra gerçekten yaparsınız), o zaman artık geçerli olmayan yorumları temizlemek iyidir.
Nick Chammas

1
Yazım tablonuza bir "Sınıflandırılmamış" türü ekleyerek ve VehTypeId alanının varsayılan değerini, yabancı anahtar alanında boş bir değere izin vermek yerine, bu sınıflandırılmamış değer haline getirmenizi öneririm. "Null" değerinin geçerli bir ticari anlamı olması genellikle kötü bir uygulamadır.
Michael Blackburn
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.