Öncelikle PostgreSQL eklentisi aktif edin.
bin/rails g migration enable_extension_for_uuid
config/initializers/generators.rb
dosyasını oluşturun.
Bu değişiklik birincil anahtarlarınızın (primary keys) varsayılan veri tipini değiştirecek ve göç (migration) ile oluşturulacak yeni tablolarda set id: :uuid
metodunun kullanılmasını sağlayacaktır.
…ilişki kuracağınız zaman type: :uuid
kullanmak zorundasınız.
Rails modellerinizde id olarak UUID kullanmanız size çakışma hatalarından kurtulmanıza yardımcı olacaktır. UUID’lerin evrensel olarak benzersiz olması demek başka modellerin aynı idye sahip olamayacağını ve tarayıcı tarafında da başka bir değer atayamayacağınızı bilmeniz demektir.
Artan tamsayı id bilgisi dış dünyadan verinizin büyüklüğünün bilinmesine yol açar. Örneğin 5 numaralı id 5. kaydı temsil eder. UUID ile veri tabanınızdaki tabloların büyüklüğünün bilinmesi imkânsızdır ki bu da bizim gizli tutmak istediğimiz bir bilgidir. Bu sorunu URL’leriniz için halka açık id’ler ya da sahte id’ler (slug) oluşturarak çözebilirsiniz ancak yerleşik bir araç varsa neden kullanmayalım ki?
Güvenlik açısından bakarsak, UUID kullanmak, sadece URL’de kullanılan id kullanılarak yapılan bir tahmin ile kötü niyetli birinin saldırı yaparak veriye ulaşmasını engeller. UUID’lerin tahmin edilmesi inanılmaz zordur.
Bu biraz daha karmaşık bir yolu seçiyorsunuz demektir ama iyi bir amaçla.
Eğer PostgreSQL kullanıyorsanız, bu basit bir değişikliktir ve çok az performans maliyeti vardır. MySQL için ise çok karmışık bir durum ve ben o zahmete girmezdim.
ActiveRecord’un ilk (first) ve son (last) metotları UUID kullanılan id’lerde beklenmeyen bir şekilde çalışıyor. Artık en büyük id’nin en yeni kayıt olduğunu düşünemezsiniz. Bu da kod tabanınıza yabancı geliştiricilerin kafasının karışmasına yol açabilir.
UUID’leri kullanmak yeni projeler için iyi bir fikir ancak çalışan bir sistemi UUID’ye geçirmek için gerçekten iyi bir nedeninizin olması gerekir.
Yazar ve Kaynak
I would like to thank Andy Croll for letting me to translate amazing blog post. Original blog post: Choose UUIDs for model IDs in Rails