ORM kullanırken, veritabanı tasarımınızda dikkat etmeniz gereken bazı noktalar nelerdir?


19

Veritabanına bir Nesne İlişkisel Eşleyici (ORM) Vikipedi kullanılarak erişileceğini bildiğinizde dikkat etmeniz gereken bazı veritabanı tasarımları nelerdir ? Ayrıca bkz. Entity Framework NHibernate veya LLBLGenPro.

Örnek olarak, SqlServer'ın RPC çağrısında 2100 parametre sınırını not edeceğim. LLBLgen kullanıldığında ve bileşik birincil anahtarlar kullanıldığında tabloları birleştirirken bu sorun ortaya çıkar . Bileşik anahtarlar için MSDN makalesine bakın .


4
Hiçbir suç, ama "1'den fazla birincil anahtar ile tabloları birleştirmek" .. Bu bir tablonun temel kurallarından birini, tablo başına tek bir PK yeniden tanımlar. Tam olarak ne demek istediniz?
Marian

Bu 2100 parametre sınırını nasıl aşar? Bu kadar sütun içeren tablolarınız var mı? Ayrıca, "Nesne-Rol Modellemesi"
John Saunders

Bir SQL 'IN' (LINQ dizisi.Contains (member)) 'a büyük bir değer listesi iletirseniz, 2100 parametre sınırı bazen bir sorundur. Ancak, bunun gerçekten veritabanı tasarımı için bir şey yok; bu daha çok bir sorgu kalıbı sorunudur. Bundan dolayı 'acı çeken' ORM'ler için en kolay çözüm, listeyi [kalıcı] geçici bir tabloya eklemek ve buna katılmak ve / veya nereden kaynaklandıkları sorgulanacak öğeleri seçen bir alt sorgu kullanmaktır. (VEYA eşleyici kullansanız da kullanmasanız da, binlerce öğenin bir SQL 'IN' öğesine aktarılması genellikle kötüdür).
KristoferA

@John, evet Nesne İlişkisel Haritalama
BozoJoe

4
@BozoJoe: bir tablonun tanımı gereği sadece bir birincil anahtarı olabilir. Tek bir tablo için birden fazla birincil anahtar tanımlamanıza izin veren DBMS yoktur.
a_horse_with_no_name

Yanıtlar:


17

Standart normalizasyon tekniklerinden, esas olarak 3. normal forma geçin. Bazı ORM'ler veritabanı düzeyinde tanımlanan ilişkileri seçebilir, böylece manuel olarak yapmanız gerekmez.

Gerçekten diğer tarafa gidip ORM'ler hakkında ne bilmeliyim diye sorardım. Bildiğinizden emin olun: - Sorguları nasıl profilleyebilirim? - ORM'yi nasıl geçersiz kılabilir ve kendi sorgumu nasıl yazabilirim? - Bunun yerine kayıtlı procları kullanabilir miyim?

Veritabanı ORM agnostik olmalıdır, çünkü büyük olasılıkla, uygulamadan daha uzun süre dayanacaktır.


+1: "Veritabanı ORM agnostik olmalıdır". Veritabanı tasarımı standartlarına sadık kalın ve iyi ORM'ler de mutlu olacaktır.
MicSim

12
  1. ORM'nin şemayı oluşturmasına veya güncellemesine asla izin vermeyin. Her zaman oluşturulan SQL'i bir şablon olarak kullanın, ancak değişikliği yapmadan önce geçin (ORM'nin gereksiz dizinler oluşturduğunu gördüm, kötü veri türleri kullanın ... tüm bu kötü şeyler)

  2. ORM'nizin yapamayacağının farkında olun. Bir süredir Django, bir ağrı olan ORM yoluyla grubu desteklemedi (hala eski sistemler eğlencelidir!). Bu nedenle, ORM'nin sınırlamalarının farkında olmak, ORM için kod yazan kişi olmasa bile DBA için bir zorunluluktur

  3. Periyodik olarak, yavaş günlüklerinizi alın, mysqlslowlog ile toplayın ve ilk 10'a bakın. Temel olarak size toplamda en fazla zaman alan sorguları gösterecektir. Yalnızca ortalama 1 saniye süren ancak geçen ay 50 bin kez çalışan bir sorgu, bu toplu rapora ağrılı bir başparmak gibi yapışır;)

Ben ORM tamamen dökümü kadar aşırı gitmek söyleyemem. ORM kullanan geliştiricileriniz DBA değilse, ORM'den daha kötü veya daha kötü SQL yazmaları muhtemeldir. Sonuçta neler olup bittiğini izlemek DBA'ya düşecek.


1
Ve saklı bir proc çok karmaşık mantık koymak düşünün. ORM'ler depolanmış proc'ları çağırabilir ve çok karmaşık mantık için bir proc'un performans ayarını yapmak daha kolaydır.
HLGEM

7

Sequel ve ActiveRecord for Ruby gibi ORM'ler tarafından oluşturulan bir veritabanından farklı olan eski bir veritabanı hakkında hemen fark ettiğim birkaç şey var .

  1. Çağrılan tüm tablolarda birincil anahtar kullanımı 'id'. Evet, bu geçersiz kılınabilir, ancak idvarsayılan değer budur.
  2. Tablolar için çoğul isimlerin kullanımı.
  3. Tabloların ve alanların açıklayıcı adını oluşturan kelimeleri ayırmak için alt çizgi ("snakecase") kullanımı.
  4. _idYabancı anahtarlara ekli kullanım : Düzen genellikle gibidir referenced_table_id.

SQL'imi yıllardır elle yazıyorum çünkü bir ORM'ye güvenmedim, ancak son iki veya üç yılda daha önce belirtilen iki ORM'yi kullanmaya başladım ve mevcut veritabanlarıyla ne kadar iyi entegre olduklarından etkilendim, ve eğer kuralları takip edilirse bir veritabanını deşifre edebilirler mi, yoksa eski bir DB'yi anlamak için onlara gereken ipuçlarını vermek için zaman ayırıyorum.

ORM'lerle güzel oynamak için şemalar tasarlamak için ortak bir yönerge olup olmadığını bilmiyorum, ancak sanırım hepimiz bazı standartlara sahip olarak fayda sağlayacağız. Bir ORM için kesinlikle bir zaman ve yer var, özellikle iyi bir OO dili kullanıyorsanız ve sıkı bir programdaysanız.


1
Bilginize: birçok OR haritacısı için konvansiyon farklılıkları isimlendirmek için araçlar vardır. Entity Framework ve Linq-to-SQL kural tabanlı adlandırma ile ilgilenen Visual Studio için bir eklenti var; bunun hakkında daha fazla bilgi için huagati.com/dbmltools adresine bakın .
KristoferA

1
Id, id alanını adlandırmak için bir SQL antipatternidir ve kullanılmamalıdır.
HLGEM

Nedenini açıklamak ister misiniz? Bire çok ve çoktan bire gibi aramalar yapmamız gerektiğinde tablolar arasındaki ilişkileri nasıl ele alırız? Kullandığım ORM'lerde kimlik kullanmama kesinlikle akışa karşı çıkıyor.
Tin Man

2

Kullandığınız VEYA eşleştiricisine biraz bağlıdır (bu yüzden, soru desteklemesindeki / desteklemede OR eşleştiricisinin hangi db özelliklerine sahip olduğunu araştırmak için biraz zaman ayırın.

Örneğin, Microsoft'un OR eşleyicileri SQL Server'ın yerleşik veri türlerinin tümünü desteklemez, bazı yeni / gelişmiş TSQL özelliklerini (özyinelemeli sorgular, optimize edici ipuçları vb. Akla gelen) desteklemez.

Teorik olarak , iyi bir OR eşleştiricisi iyi tasarlanmış bir ilişkisel veritabanı şemasını iyi bir nesne modeliyle üstesinden gelebilecek (ve eşlemenize izin verecek) esnek olmalıdır. Gerçekte, bulmacanın tüm parçaları yerleştirilmeden önce hala gidecek çok şeyimiz var; birçok OR eşleyici gelişmiş eşlemeyi desteklese de, genellikle karmaşık sorgular ve performans sorunları pahasına gelir.

İyi db performansı için (ve dba'nın akıl sağlığını korumak için :)) db şema tasarımı söz konusu olduğunda hala en iyi uygulamaları takip etmelisiniz; önce normalleştirin ve gerekli olduğu yerde denormalize edin. Kod tarafında, nesne modelinizle aşırıya kaçmayın ; OR eşleştiricisi, birçok tabloyu bir araya getiren karmaşık kalıtım modellerini ve varlıkları desteklese bile, bunlar aynı zamanda veritabanına vuran aşırı karmaşık sorgular ile sorun yaşama riski taşıyan alanlardır. Profil, profil, profil ve yalnızca ORM'yi alma için oluşturulan sorgular verildi. OR eşleştiricisi tarafından oluşturulan sorguların genellikle normal SQL sorguları gibi değiştirilebileceğini ve nesne tarafındaki işlevsel olarak eşdeğer iki sorgunun (örneğin, linq sorguları) bazen çok farklı SQL sorgularına neden olabileceğini unutmayın.

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.