Kimlik olarak Etki Alanı Nesneleri bazı karmaşık / ince sorunlar yaratır:
Seri hale / Seri kaldırma
Nesneleri anahtar olarak saklarsanız, nesne grafiğini serileştirmek son derece karmaşık hale gelir. stackoverflowÖzyineleme nedeniyle JSON veya XML'ye saf bir serileştirme yaparken hata alırsınız . Daha sonra, nesne örneğini serileştirmek ve özyineleme oluşturmak yerine, gerçek nesneleri kendi kimliklerini kullanmak için dönüştüren özel bir serileştirici yazmanız gerekir.
Nesneleri tür güvenliği için geçirin, ancak yalnızca kimlikleri saklayın, ardından çağrıldığında ilgili varlığı tembel yükleyen bir erişimci yönteminiz olabilir. İkinci düzey önbellekleme sonraki çağrılarla ilgilenir.
İnce referans sızıntıları:
Etki alanı nesnelerini, sizin gibi yapıcılarda kullanırsanız, etkin olarak kullanılmayan nesneler için belleğin geri kazanılmasına izin vermek çok zor olacak dairesel başvurular oluşturacaksınız.
İdeal Durum:
Opak kimlikleri vs int / long:
A id, neyi tanımladığı hakkında hiçbir bilgi taşımayan tamamen opak bir tanımlayıcı olmalıdır. Ancak, sistemde geçerli bir tanımlayıcı olduğunu doğrulamalıdır.
Ham türler bunu kırıyor:
int, longVe StringRDBMS sisteme tanımlayıcılar için en yaygın olarak kullanılan ham türleridir. Onlarca yıl öncesine dayanan uzun bir pratik nedenler tarihi vardır ve hepsi spaceya tasarruf timeya da tasarruf ya da her ikisine de uyan tavizlerdir .
Sıralı kimlikler en kötü suçlulardır:
Sıralı bir kimlik kullandığınızda, geçici olarak semantik bilgileri kimlik olarak varsayılan olarak paketlersiniz. Kullanılana kadar kötü değil . İnsanlar kimliğin anlamsal kalitesini sıralayan veya filtreleyen iş mantığı yazmaya başladığında, gelecekteki koruyucular için bir acı dünyası kuruyorlar.
String Alanlar sorunludur, çünkü saf tasarımcılar içeriğe, genellikle geçici anlambilimde de bilgi toplarlar.
Bunlar çünkü, hem de dağıtılmış veri sistemi oluşturmak mümkün değildir yapmak 12437379123olduğunu değil benzersiz global. Dağıtılmış bir sistemdeki başka bir düğümün aynı numaraya sahip bir kayıt oluşturma şansı, bir sistemde yeterli veri elde ettiğinizde neredeyse garanti edilir.
Sonra hackler etrafında çalışmaya başlar ve her şey buharda bir karmaşaya dönüşür.
Devasa dağıtılmış sistemleri ( kümeleri ) göz ardı etmek, verileri diğer sistemlerle de paylaşmaya çalıştığınızda tam bir kabus haline gelir. Özellikle diğer sistem kontrolünüz altında değilse.
Aynı problemle, kimliğinizi global olarak nasıl benzersiz hale getireceğinizle sonuçlanırsınız.
UUID bir nedenle oluşturuldu ve standartlaştırıldı:
UUIDkullandığınız şekle bağlı olarak yukarıda listelenen tüm sorunlardan muzdarip olabilir Version.
Version 1benzersiz bir kimlik oluşturmak için bir MAC adresi ve zamanı kullanır. Bu kötüdür, çünkü konum ve zaman hakkında anlamsal bilgi taşır. Bu kendi başına bir sorun değildir, saf geliştiriciler iş mantığı için bu bilgilere güvenmeye başlarlar. Bu ayrıca herhangi bir saldırı girişiminde kullanılabilecek bilgileri de sızdırıyor.
Version 2bir kullanıcı UIDya da GIDdomian kullanır ya UIDda GUIzamanın yerine veri sızıntısı ve bu bilgilerin iş mantığında kullanılması riski Version 1kadar kötüdür Version 1.
Version 3benzerdir, ancak MAC adresini ve zamanı kesinlikle semantik anlamı olan bir şeyden oluşan bir MD5karma ile değiştirir byte[]. Endişelenecek veri kaçağı yoktur, byte[]kurtarılamaz UUID. Bu, belirli bir şekilde UUIDörnek formu ve dış anahtar belirleyici bir şekilde oluşturmanın iyi bir yolunu sunar .
Version 4 sadece iyi bir çözüm olan rastgele sayılara dayanır, kesinlikle semantik bilgi içermez, ancak deterministik olarak yeniden oluşturulamaz.
Version 5gibi Version 4ama sha1yerine kullanır md5.
Etki Alanı Anahtarları ve İşlem Veri Anahtarları
Etki alanı nesne kimlikleri için tercihim, teknik nedenlerden dolayı kullanmak Version 5veya Version 3kısıtlanmış Version 5olması.
Version 3 birçok makineye yayılmış işlem verileri için mükemmeldir.
Alan tarafından kısıtlanmadıkça bir UUID kullanın:
Benzersiz, garantili bir veritabanından veri dökümü ve farklı etki alanı verilerine atıfta bulunan yinelenen kimlikler hakkında endişelenmeniz gerekmediği başka bir veritabanına yeniden yükleme.
Version 3,4,5 tamamen opak ve bu şekilde olmalı.
A ile birincil anahtar olarak tek bir sütuna sahip UUIDolabilirsiniz ve daha sonra doğal bir bileşik birincil anahtarın ne olacağı için bileşik benzersiz dizinlere sahip olabilirsiniz.
Depolama alanı da olmak zorunda değildirCHAR(36) . UUIDHala endekslenebilir olduğu sürece belirli bir veritabanı için yerel bir bayt / bit / sayı alanında saklayabilirsiniz .
miras
Ham türleriniz varsa ve bunları değiştiremiyorsanız, yine de kodunuzda soyutlayabilirsiniz.
Bir kullanma Version 3/5arasında UUIDsende geçebilir Class.getName()+ String.valueOf(int)bir şekilde byte[]ve yeniden oluşturulabilir ve deterministik bir opak referans anahtarı var.