SORU
9 Temmuz 2011, CUMARTESİ


'Z' yerine eksik verileri temsil etmek için NULL standart?

Ya hiç Boşluk kullanılmalıdır olup olmadığı tartışma dışında: NULL, "eksik ya da hiç" veri. girdi demek için kullanan varolan bir veritabanı sorumluyum Demek ki boş bir dize, farklıdır "bir kullanıcı bu değeri ayarlayın, ve onlar seçilmiş 'boş'."

Proje üzerinde başka bir müteahhit sıkıca "Boşluk benim için yok; hiç BOŞ kullanın ve kimsenin etmeli, ya da" yan argüman. Ancak, ne şaşırtır beni o günden beri müteahhit takımı MI kabul arasındaki fark "eksik/hiç girdi" ve "kasıtlı olarak boş veya belirtilen kullanıcı olarak bilinmeyen," kullandıkları tek bir karakter 'Z' boyunca kendi kodu ve saklı yordamları için temsil "eksik/hiç girdi" ile aynı anlamda NULL boyunca dinlenme veritabanı.

Ancak bizim Paylaşılan müşteri istedi için bu değişecek ve ben desteklenen bu istek, takım değinir bu "standart bir uygulama" arasında DBA çok daha gelişmiş daha ben; onlar isteksiz değiştirmek için kullanın boş Değerlere göre benim cahil isteği yalnız. Kimse bana benim cehalet üstesinden yardımcı olabilir? Orada bireyler, ya da kullanımını savunan SQL uzmanlar arasında tek yüksek sesle bile standart, ya da küçük bir grup herhangi bir 'Z' NULL yerde?

Güncelleme

Eklemek için yüklenici bir yanıt var. Müşteri özel değerleri için veri içeren sütunlar NULL izin kaldırılmasını istedi " dedi

Temelde, veritabanı mümkün olduğunca Boşluk önlemek için tasarladım. İşte gerekçesi:

[VARCHAR] string bir alanda NULL (sıfır uzunluk) boş bir dize tam olarak aynı bilgileri vermektedir, çünkü her zaman gerekli değildir.

Bir tamsayı alanı BOŞ (örneğin, KİMLİK değeri) hiç verilerde ortaya çıkabilecek bir değeri kullanarak ele alınabilir (e.g, -1 tamsayı KİMLİĞİ alanı için).

Tarih alanına NULL kolayca tarih hesaplamaları komplikasyonlara neden olabilir. Örneğin, mantık bu hesaplar tarih farklar gibi fark gün arasında bir [RecoveryDate] ve bir [OnsetDate], mantığı havaya uçurmak eğer bir veya iki hurma NULL -- sürece açık bir yardımdır yapılan her iki tarih olmak NULL. Bu ekstra iş ve ekstra ilgileniyor. Eğer "varsayılan" ya da "tutucu" tarihleri için kullanılır [RecoveryDate] ve [OnsetDate] (örneğin, "1/1/1900") , matematiksel hesaplamalar olabilir göster "sıradışı" değerleri -- ama tarih mantık olmaz havaya uçurmak.

NULL geleneksel geliştiriciler saklı yordamları hata yapan bir alan olmuştur.

Bir DBA olarak 15 yıldır, en iyisi mümkün olduğunca Boşluk önlemek için buldum.

Bu soru için çok olumsuz tepki doğrulamak gibi görünüyor. Boşluk tasarımı için kabul 6NF bir yaklaşım uygulamak yerine, özel değerleri "mümkün olan her yerde Boşluk kaçının." için kullanılmaktadır Yayınlanan bu soru ile açık bir zihin ve memnun olduğumu öğrendim daha "yararlı Null / Null kötü" tartışma, ama ben artık çok rahat etiketleme 'özel değer' yaklaşımı olması tam bir saçmalık.

boş (sıfır uzunlukta bir dize aynı bilgiler içeriyor kesinlikle.

Yok, Yok, Yok; varolan veritabanı değiştirme, BOŞ anlamına gelir biz "asla" ve boş bir dize "anlamına gelir boş olarak girdi" girmiş.

NULL geleneksel geliştiriciler saklı yordamları hata yapan bir alan olmuştur.

Evet, ama bu hatalar geliştiriciler binlerce tarafından binlerce kez yapıldı, ve bu hatalardan kaçınmak için dersler ve uyarılar bilinen ve belgelenmiştir. Olduğu dile getirildi burada: veya Boşluk kabul veya reddetme olsun, eksik değerleri temsil edilirsorun çözüldü. Geliştiriciler kolay aşmış ve kolay tanınır) hata yapar devam diye yeni bir çözüm icat etmeye gerek yok.


Bir dipnot olarak: 20 yılı aşkın süredir yapmış olursun ve bir geliştirici kesinlikle bana veritabanı Mühendisi arasında fark veritabanı yöneticisi bilmek için yeterince zamanı olan) olmuştur. Kariyerim boyunca hep "Null yararlı bazı çok zeki insanlar aynı fikirde olduğunu düşünüyorum ama" kampı. olmuştur "Özel değerler", ama çok bilgili akademisyenler yeterli değil "Nasıl Önlemek İçin Doğru Yolu sağlam bir duruş yapmak için". NULL yaklaşım hakkında çok şüpheliydim Ben her zaman yeni şeyler—ve hala öğreneceği çok şey var öğrenmeye 20 yıl sonra aşk. Bu yararlı bir tartışma yapmak için emeği geçen herkese teşekkürler.

CEVAP
10 Temmuz 2011, Pazar


Çuval yüklenici.

Tamam, cidden, bu standart bir uygulama değil. Bu görülebilir, çünkü tüm VERİTABANI var, daha önce çalıştığım uygulamak NULL, mantık NULL, hesabın BOŞ yabancı anahtarlar, farklı davranışlar için BOŞ yer SAYISI, vs, vs.

Aslında 'Z' ya da başka bir yer tutucu kötüdür. kullanarak iddia ediyorum Hala kod için kontrol etmemiz gerekiyor ''. Z Ama aynı zamanda 'Z' anlamına gelmez 'Z', başka bir şey anlamına gelir. bu belge gerekiyor Ve bu belgeleri okuyun emin olun. Ve sonra ne olursa 'Z' hiç veri geçerli bir parça olur? (Bir alan için bir başlangıç mı?)

Hatta BOŞ vs geçerliliği 'Z', yüklenici standart uygulamaları için uygun olan ısrar ederim o şirket içinde, onun mevcut değil. tartışma olmadan temel düzeyde, Alternatif standart bir uygulama ile bir ortamda kendi standart uygulama tesis karışıklık, bakım giderleri, yanlış anlama, ve sonunda artan maliyetler ve hatalara neden olur.


EDİT

BOŞ bir alternatif kullanma bence geçerli olduğu durumlar vardır. Ama sadece bunu yaparken kodu, muhasebe gerektiren özel durumlar oluşturmak yerine azaltır.

Örneğin tarih ilişkili veri için bunu kullandım. Eğer veri başlangıç tarihi ve son tarih arasındaki geçerliyse, kod NULL değerlere sahip basitleştirilmiş olabilir. Başlangıç tarihi bir NULL ile değiştirilebilir yerine '01 Oca 1900' ve son tarih NULL ile değiştirilebilir '31 Aralık 2079'.

Bu hala beklenen bir şey, davranış değişikliği ve dikkatli kullanılması gerekir bu yüzden

  • WHERE end-date IS NULL artık hala geçerli bir veri ver
  • Sadece kendi millennium bug yarattı
  • vb.

Bu soyutlamalar tüm özellikleri her zaman geçerli değeri olan bu reform eşdeğerdir. Keyfi olarak seçilen değerleri içine örtülü olarak belirli bir anlam kodlama oldukça farklı.

Yine de, yüklenici çuval.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Absolute Zero(Programming Tutorials)

    Absolute Zer

    22 Kasım 2012
  • Anthony Cumia

    Anthony Cumi

    5 EYLÜL 2006
  • Menglong Tav

    Menglong Tav

    18 Temmuz 2010