Power BI ‘daki Assume Referential Integrity opsiyonu, sadece ve sadece direct query modundaki tablolar için geçerli. Import modundaki tablolarda bu opsiyon yok. Bu opsiyonun seçilebilir olması için, tablolar arasındaki ilişki tipinin 1-1 veya 1-∞ olması ve tabloların aynı veri kaynağından gelmesi gerekiyor. Eğer 1-∞ ilişki varsa, many tarafındaki tablonun anahtar sütununda null/blank değerlerin olmaması lazım (Ama müsade ediyor). Opsiyonun ne işe yaradığına geçmeden önce referential integrity ne demek -tekrar- tariflemekte fayda var.
Referential Integrity, master ve fact tablolarında geçen kayıtların birbirleriyle eşleşmemesi ile ilgili bir durum. Konuyla ilgili daha önce yazdığım bu, bu ve bu yazılara da göz atmanızı öneririm. Developer iseniz -mutlaka- bilinmesi gereken durumlar.
Referential Integrity iki durumda bozulabilir:
Fact tablosunda geçen ama master tabloda karşılığı olmayan kayıtlarınız vardır.
Ya da fact tablosundaki anahtar sütun null/blank değer(ler) içeriyordur.
Fact tablosunda geçen Ürün ID 9 ve 10 ilgili master tabloda yok. + Ürün ID değerinin fact tablosunda null/blank olduğu değerler var. Bu, referential integrity’nin, yani bütünlüğün bozulması demek!
Eğer modelinizde bu tür eşleşmeyen kayıtlar varsa, DAX Studio ile modele bağlandığınızda bütünlüğü bozan bu kayıtları görebilirsiniz.
Örnek veriyi içeren tablolara direct query ile bağlanıp Ürün ID sütunları üzerinden ilişki kuralım.
Aşağıdaki gibi bir matris oluşturduğumuzda, eşleşmeyen tüm kayıtlar için Ürünler tablosunda fiktif bir blank satırı oluşacak ve tüm eşleşmeyen kayıtlar bu blank satırı ile eşleştirilecek. Bunu yaparken kullanılan join tipi: LEFT OUTER JOIN.
Aradaki ilişkinin özelliklerinden referential integrity opsiyonunu işaretleyince uyarısını yapıyor!
Satışlar tablosunda geçen ama Ürünler tablosunda karşılığı olmayan, yani match etmeyen, eşleşmeyen kayıtlar var!
Biraz önce eşleşmeyen tüm kayıtları tek bir blank kaydı altında gösteren matris bu sefer sadece eşleşen kayıtlar üzerinden çalışıyor.
Çünkü biraz önce LEFT OUTER JOIN ile birleşen tablolar şimdi INNER JOIN ile birleşiyor. Yani her iki tablodan da sadece eşleşen, match eden kayıtlar üzerinden çalışacak.
Ne avantajı olabilir bu durumun?
Eğer direct query ile bağlandığınız tablolar büyükse ve referential integrity ‘yi bozan kayıtlarınız yoksa sorgu performansı hızlanacaktır. Bu yüzden eğer verilerinizde her şey birebir eşleşiyorsa bu opsiyonu kullanmalısınız.
Ama verilerinizde eşleşmeyen kayıtlar varsa, yazdığınız metrikler bu eşleşmeyen kayıtları dikkate almayacak! İlişkiyi ilk kez kurarken bu durumu kontrol edip gerekirse uyarıyor, ama daha sonra verileriniz değiştiğinde bu kontrolü tekrar yapmıyor.
İlgili Microsoft dokümanlarına bu ve bu linkten erişebilirsiniz.
Her şeyin birebir eşleştiği, veri kalitesi sorunu olmayan modeller dilerim herkese!