Etki Alanına veya Etki Alanına


15

SQL92 ve SQL99 standartları DDL yapılarını tanımlar . Tüm veritabanları bunu desteklemez veya farklı bir ada sahip değildir (örneğin SQL Server'da Kullanıcı Tanımlı Türler vardır ).CREATE DOMAIN

Bunlar, izin verilen değerlerle ilgili kuralları basitleştirmek ve uygulamak için veritabanında kullanılacak kısıtlanmış bir veri türü tanımlanmasına izin verir. Böyle bir veri tipi, sütun bildirimlerinde, saklı yordamlara ve işlevlere vb. Girdi ve çıktılarda kullanılabilir.

Bilmek isterim:

  • İnsanlar veritabanı tasarımlarında gerçekten alan kullanıyorlar mı?
  • Öyleyse ne ölçüde?
  • Ne kadar yararlılar?
  • Hangi tuzaklarla karşılaştınız?

Ben gelecekteki veritabanı geliştirme bunları kullanma uygulanabilirliğini değerlendirmek için çalışıyorum.


1
Bunu da bilmek istiyorum ... İnsanların söylediklerini duymak istiyorum.
maple_shaft

Yanıtlar:


2

Her zaman oldugu gibi...

Değişir

Birden fazla yerde kullanılan ve yerel olarak desteklemeyi büyük ölçüde çaba gerektirecek ve / veya gereksiz kısıtlamalar ve davranışlar gerektirecek bir alan varlığınız var mı?

Öyleyse, alan adı uzakta. Değilse, rahatsız etmeyin.

Yukarıdaki buluşsal yöntemlere dayanarak SQL Server'da tam olarak bir kez kullanıcı tanımlı bir tür oluşturmayı gerekli buldum. Artık ne olduğunu hatırlamıyorum - ama neden olduğundan daha fazla iş tasarrufu sağladı.


5

SQL Server ve C # kullanıcısı olarak , uygulama tarafında çok daha güçlü olduğum için veritabanında Kullanıcı Tanımlı Türler kullanmadım. LINQ to SQL ve Entity Framework gibi ORM'lerden sonra, sunucu yeteneklerini kullanmam çok azaldı.

Örneğin, .NET'in Küreselleşme gücüne dayalı olarak Gregoryen tarih saatlerini başka biçimlere aktarmak için bazı DateTime dönüştürme işlevlerini SQL Server'a yüklemek için CLR entegrasyonu kullanıyordum. Ama şimdi, işler farklı ve artık bunu yapmıyorum. Sadece uygulama katmanımdaki verileri yükler ve dönüşümü yaparım.

Bu yüzden, neredeyse 4 yıl boyunca düşünebildiğim tüm takımları programlayıp inceledikten sonra, Kullanıcı Tanımlı Türleri kullanmanın bir örneğini bulamadım. Ayrıca birçok .NET blogunda iş başında görmedim.

Bu, insanların Veritabanı Etki Alanı'nı kullanmadığı anlamına gelmese de, en azından Veritabanı Etki Alanı'nı kullanmanın o kadar yaygın olmadığı anlamına gelir .


"Uygulama tarafında çok daha güçlü olduğum için veritabanında Kullanıcı Tanımlı Türleri kullanmadım " : bunun yerine kısıtlamaları mı kullanıyorsunuz? Anlamıyorum, uygulama açısından farkı nedir?
Arseni Mourzenko

@MainMa, örneğin, veritabanı katmanında Student sınıfı oluşturmuyorum . Sadece tamsayı ve dize gibi tüm ilkel veri türlerine sahip bir öğrenci tablosu oluştururum ve daha sonra ORM'yi kullanarak, herhangi bir kaydı uygulamadaki bir nesneye eşlerim.
Saeed Neamati

Anladım. Haklısın.
Arseni Mourzenko

3

Yığın Taşması konusunda zaten ayrıntılı bir cevap var. Çoğunlukla katılıyorum, ancak verilen örnekle değil, alıntı yapıyorum:

“Örneğin, Cinsiyet alanında yalnızca uygun verilere izin verilmesini sağlayan bir" GenderType "(karakter (1), boş bırakılamaz," M "veya" F ") tanımlıyorum."

Şahsen, daha rahat ayar char(1)tipi ve sütun üzerinde bir kısıtlama tanımlamak hissediyorum . Kısıtlama ihlal edildiğinde, yanlış yaptığımı bulmak için tam olarak nerede arama yapacağımı biliyorum. Ayrıca kullanıcı tanımlı türlerden daha fazla bilinir, bu nedenle sadece kısıtlamaları kullanan veritabanının yeni başlayanlar için anlaşılması daha kolay olacaktır.

Tabii ki, sadece kişisel bir görüştür. Diğer insanlar bir in ('M', 'F')kısıtlamanın kendi kendini belgelemediğini ve veritabanını keşfeden yeni bir geliştirici için çok belirsiz olabileceğini söyleyebilirler .

IMO, daha karmaşık türler için kullanıcı tanımlı türleri ve temel bir şey için kısıtlamaları kullanın. Ayrıca, bir tür için açık bir adı kolayca bulamadığınızda, bir kısıtlamanın daha iyi uyma olasılığı vardır.


Hermafroditler ne olacak?
Wyatt Barnett

Veya interseks? Veya transpeople?
Broam

1

Bu özelliği kendim kullanmadım ama sanırım şunlardan emin olmalısın:

  1. Veritabanınız tek bir sistem tarafından kullanılıyorsa, bu özelliği kullanmamak ve kontrol mantığını iş katmanınıza veya eşdeğerine eklemek mantıklı olabilir. Bu size doğrulamada daha fazla esneklik kazandıracaktır (düzenli ifadeler kullanarak) ve tüm doğrulama mantığını tek bir yerde kapsüllemeyi mümkün kılacaktır. Veritabanınız birkaç sistem tarafından paylaşılıyorsa, bunun yerine bu görev için çok uygun tetikleyiciler kullanabilirsiniz.

  2. Bir doğrulama hatasıyla karşılaşıldığında UDT'nin istemciye döndürülen hata mesajlarını özelleştirmenize izin verip vermediğinden emin değilim.

  3. Aynı doğrulama kuralı birkaç sütun için geçerliyse UDT'ler çok kullanışlıdır. Bence, bunu normalleştirilmiş veritabanı tasarımı ile iş uygulamalarında çok yaygın bir durum olarak görmüyorum.

İ işaretleyerek ilginizi çekebilir "[SQL Server] Kullanıcı Tanımlı Türlerinin Noktası nedir?" blog makalesi.


1
Üçüncü nokta için +1. Aynı kısıtlamayı benim yaptığım gibi tekrar tekrar yazmak, özellikle kısıtlamanın zaman içinde değişebileceği ve birkaç yerde değiştirilmesi gerektiğinde yapılacak en iyi şey değildir.
Arseni Mourzenko

0

"Tüm veritabanları bunu desteklemiyor" derseniz, daha iyi bir şekilde koymanın aşağıdaki gibi olduğunu düşünüyorum:

Tetikleyicileri, işlevleri ve diğer gelişmiş özellikleri kapsamlı bir şekilde destekledikleri için her büyük veritabanı bunu destekler.

Bu bizi bunun gelişmiş SQL'in bir parçası olduğu ve bir noktada mantıklı olduğu sonucuna götürüyor.

Do people actually use domains in their database designs?

Gereken kapsamlı kapsam nedeniyle (operatörler, dizinler vb. Dikkate alındığında) daha az mümkün

If so to what extent?

Yine, olabildiğince sınırlı, mevcut bir tür biraz ek tanımlı mantık (yani kontroller vb.) İle birleştiğinde hile yapabilirse, neden bu kadar ileri gidebiliriz?

How useful are they?

Bir sürü. Bir saniye boyunca bu örnek için bir nedenden dolayı seçtiğim MySQL gibi çok iyi olmayan bir DBMS'yi düşünelim: inet (IP adresi) türü için iyi bir destek yok.

Şimdi çoğunlukla aralıklar gibi IP verilerine odaklanan bir uygulama yazmak istiyorsunuz ve varsayılan tür ve sınırlı işlevselliği ile sıkışmış durumdasınız, ya ek işlevler ve işleçler yazacaksınız (postgreSQL için yerel olarak desteklenenler gibi) örneğin) veya ihtiyacınız olan her işlevsellik için çok daha karmaşık sorgular yazın.

Bu, kendi işlevlerinizi tanımlamak için harcanan zamanı kolayca gerekçelendirebileceğiniz bir durumdur (PostgreSQL'de inet >> inet: aralık operatörünün kapsama alanı).

Bu noktada, genişletilmiş veri türü desteğini haklı gösterdiniz, yeni bir veri türü tanımlamanın yalnızca bir adımı daha var.

Şimdi gerçekten güzel tip desteği olan ancak ihtiyacınız olmayan imzasız int .. olan PostgreSQL'e geri dönün, çünkü depolama / performans (kim bilir ...) hakkında gerçekten endişelisiniz, operatörler - tabii ki bu çoğunlukla mevcut int operatörlerinden türemiştir.

What pitfalls have you encountered?

Şimdiye kadar bununla oynamıyorum, bunun için gereken zamanı hem gerektiren hem de haklı gösteren bir projem yoktu.

Bununla birlikte görebildiğim en büyük sorunlar, tekerleği yeniden icat etmek, "güvenli" katmana (db) hatalar getirmek, sadece aylar sonra CONCAT (cast * AS varchar) başarısız olduğunda fark edeceğiniz eksik tip desteği sunmak olacaktır. oyuncu kadrosu (varchar olarak newtype) tanımlamamıştır.

"Yaygın olmayan" vb. Hakkında cevaplar vardır. Kesinlikle bunlar nadirdir ve nadir olmalıdır (aksi takdirde dbms'in birçok önemli türü olmadığı anlamına gelir), ancak öte yandan, bir (iyi) db'nin ACID uyumlu ( bir uygulamadan farklı olarak) ve tutarlılıkla ilgili her şeyin orada daha iyi tutulması.

İş mantığının yazılım katmanında işlendiği ve daha güvenli olduğu SQL'de yapılabileceği birçok durum vardır. Uygulama geliştiricileri uygulama katmanı içinde daha rahat hissetme eğilimindedir ve genellikle SQL'de uygulanan daha iyi çözümlerden kaçınırlar, bu iyi bir uygulama olarak düşünülmemelidir.

UDT'ler optimizasyon için iyi bir çözüm olabilir, char (1) kullanılarak m / f tipi hakkında başka bir cevapta iyi bir örnek verilir. Bir UDT olsaydı, bunun yerine bir boolean olabilir (üçüncü ve dördüncü seçenekleri sunmak istemedikçe). Tabii ki hepimiz bunun sütun yükü nedeniyle gerçekten bir optimizasyon olmadığını biliyoruz, ancak olasılık var.


Belirli özelliği (alan adları) olduğu değil tüm veritabanları tarafından desteklenen. Evet, tetikleyicileri, kısıtlamaları ve işlevleri kullanarak onu taklit edebilirsiniz , ancak bu onu desteklenen bir özellik yapmaz.
Oded

Tetikleyicileri, işlevleri ve diğer gelişmiş özellikleri kapsamlı bir şekilde destekledikleri için her büyük veritabanı bunu destekler. Bazı gerçekten hafif özellikli / boktan olanlar bunu yapmazlar ve onları kullanan hiç kimse, sınırlamaları kullanıcıya özgü türlerden çok daha fazla
gerildiğinden

0

Kağıt üzerinde, UDT'ler harika bir kavramdır. DB'nizi gerçekten normalleştirmenize (örneğin, birbirine bağlı iki sütun olduğunda) ve ayrıca yeni türünüzle ilgili herhangi bir mantığı kapsüllemenize izin verir.

Uygulamada, ödediğiniz fiyat (bugün) çok yüksek. Açıkçası geliştirme yükü var, ancak bunun dışında çeşitli ORM ve raporlama araçlarından destek kaybediyorsunuz ve çözümün genel karmaşıklığını biraz artırıyorsunuz. Dışarıda UDT'lere yakından aşina olan çok fazla geliştirici yok ve yönetilen UDT'lerin örneklerin dışında kullanıldığını hiç görmedim.

En iyi UDT olarak yapılmış bir türün en iyi örneklerinden biri (zaten yoksa) olması gerekir hierarchyid( MSDN bağlantısı ). Verimli kalması için değerini, tipin işlevleri olmadan sürdürmek için külfetli olacağı ikili bir formatta (olağan varchar özel uygulamalarının aksine) saklar. Tipin sağladığı 10 veya daha fazla yöntem, harici fonksiyonların aksine, tipin bir parçası olarak en iyi şekilde sağlanır. Bunun gibi durumlarda özel yönetilen UDT'yi, ayrı bir tür olarak verimli ve düzgün bir uygulama sağlayarak elde edilecek önemli bir kazancın olduğu durumlarda kullanmayı düşünürüm.


0

Daha pratik bir soru / cevap. Şirketiniz kullanmasına izin veriyor mu?

Onun şirket farklı DDL (ler) ele birkaç DBSQL markaları ile çalışıyor?

Her veritabanı markası, Kullanıcı Tanımlı Türler gibi iyi ek özellikler sunabilir, ancak şirketiniz birkaç DB kullanıyorsa, standart olmayan özelliklerle ilgili sorun yaşayabilirsiniz.

Şirket yalnızca sizseniz veya hangi Veritabanlarını ve özellikleri kullanacağınıza karar verebiliyorsanız DDL kullanabilirsiniz

Kullanıcı Tanımlı Tip'in yararlı olabileceği birkaç projeyle çalışıyorum, ancak birkaç DB ile uğraşmamız gerektiğinden daha standart özelliklere bağlı kalmalıyım. (S).

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.