Uygulama geliştiricileri tarafından yapılan veritabanı geliştirme hataları [kapalı]


566

Uygulama geliştiricileri tarafından yapılan yaygın veritabanı geliştirme hataları nelerdir?


Yanıtlar:


1002

1. Uygun endeksleri kullanmamak

Bu nispeten kolay bir şey ama yine de her zaman oluyor. Yabancı anahtarlar üzerinde dizinler olmalıdır. Eğer bir alanı bir alan üzerinde kullanıyorsanız WHERE(muhtemelen) üzerinde bir indeks olmalıdır. Bu tür dizinler genellikle yürütmeniz gereken sorguları temel alan birden çok sütunu kapsamalıdır.

2. Referans bütünlüğünü zorlamamak

Veritabanınız burada değişiklik gösterebilir, ancak veri tabanınız referans bütünlüğünü destekliyorsa - yani tüm yabancı anahtarların var olan bir varlığı göstereceği garanti edilirse - kullanmalısınız.

Bu hatayı MySQL veritabanlarında görmek oldukça yaygındır. MyISAM'ın bunu desteklediğine inanmıyorum. InnoDB yapar. MyISAM kullanan veya InnoDB kullanan ancak yine de kullanmayan kişileri bulacaksınız.

Daha fazla burada:

3. Yedek (teknik) birincil anahtarlar yerine doğal anahtarlar kullanma

Doğal anahtarlar (görünüşte) benzersiz olan dışsal anlamlı verilere dayanan anahtarlardır. Yaygın örnekler arasında ürün kodları, iki harfli durum kodları (ABD), sosyal güvenlik numaraları vb. Sayılabilir. Yedek veya teknik birincil anahtarlar, sistem dışında kesinlikle hiçbir anlamı olmayan anahtarlardır. Yalnızca varlığı tanımlamak için icat edilirler ve genellikle otomatik olarak artan alanlar (SQL Server, MySQL, diğerleri) veya dizilerdir (en önemlisi Oracle).

Bence her zaman yedek anahtar kullanmalısınız. Bu sorun şu sorularda ortaya çıktı:

Bu, üzerinde anlaşmaya varmayacağınız tartışmalı bir konudur. Doğal anahtarların bazı durumlarda iyi olduğunu düşünen bazı insanlar bulabilirsiniz, ancak yedek anahtarların tartışmasız gereksiz olmaktan başka bir eleştiri bulamazsınız. Bana sorarsan bu oldukça küçük bir dezavantaj.

Unutmayın, ülkeler bile var olabilir (örneğin, Yugoslavya).

4. DISTINCTÇalışması gereken sorular yazma

Bunu sık sık ORM tarafından oluşturulan sorgularda görürsünüz. Hazırda Bekletme'nin günlük çıktısına bakın ve tüm sorguların şununla başladığını göreceksiniz:

SELECT DISTINCT ...

Bu, yinelenen satırları döndürmemenizi ve böylece yinelenen nesneleri elde etmenizi sağlamak için bir kısayoldur. Bazen insanların bunu yaptığını görürsünüz. Çok fazla görürseniz, gerçek bir kırmızı bayrak. Bu DISTINCTkötü değil veya geçerli uygulamaları yok. (Her iki durumda da) yapar, ancak doğru sorguları yazmak için bir vekil veya bir durma aralığı değildir.

Gönderen ben DISTINCT Nefret Neden :

İşler bir geliştirici, önemli bir sorgu bina tablolar birlikte katılarak ve tüm zaman benim görüşüm ekşi gitmek başlamak Nerede ani o olduğunu fark görünüyor o yinelenen (hatta daha çok) satır ve onun hemen yanıt oluyor gibi ... onun bu "soruna" "çözümü" DISTINCT anahtar kelimesini atmak ve POOF tüm sıkıntılarını ortadan kaldırıyor .

5. Birleştirmeler üzerinde toplama lehine

Veritabanı uygulama geliştiricileri tarafından yapılan bir diğer yaygın hata, birleştirmelerle ne kadar daha pahalı bir toplamanın (yani GROUP BYmadde) karşılaştırılabileceğinin farkına varmamaktır.

Bunun ne kadar yaygın olduğu hakkında bir fikir vermek için, bu konu hakkında birkaç kez burada yazdım ve bunun için çok aşağı indirildim. Örneğin:

Gönderen SQL deyimi - “tarafından ve sahip grubu” vs “katılmak” :

İlk sorgu:

SELECT userid
FROM userrole
WHERE roleid IN (1, 2, 3)
GROUP by userid
HAVING COUNT(1) = 3

Sorgu süresi: 0.312 s

İkinci sorgu:

SELECT t1.userid
FROM userrole t1
JOIN userrole t2 ON t1.userid = t2.userid AND t2.roleid = 2
JOIN userrole t3 ON t2.userid = t3.userid AND t3.roleid = 3
AND t1.roleid = 1

Sorgu süresi: 0,016 s

Doğru. Önerdiğim birleştirme sürümü toplu sürümden yirmi kat daha hızlı.

6. Görünümler aracılığıyla karmaşık sorguları basitleştirmemek

Tüm veritabanı satıcıları görünümleri desteklemez, ancak bunu yapanlar için mantıklı bir şekilde kullanılırsa sorguları büyük ölçüde basitleştirebilirler. Örneğin, bir projede CRM için genel bir Parti modeli kullandım . Bu son derece güçlü ve esnek bir modelleme tekniğidir ancak birçok birleşmeye yol açabilir. Bu modelde şunlar vardı:

  • Parti : insanlar ve kuruluşlar;
  • Tarafların Rolü : bu tarafların yaptıkları, örneğin Çalışan ve İşveren;
  • Parti Rolü İlişkisi : Bu rollerin birbirleriyle nasıl ilişkili olduğu.

Misal:

  • Ted, Partinin bir alt türü olan bir Kişidir;
  • Ted'in biri Rol Çalışan olmak üzere birçok rolü vardır;
  • Intel bir Partinin alt tipi olan bir kuruluştur;
  • Intel'in biri Rolü İşveren olmak üzere birçok rolü vardır;
  • Intel Ted'i kullanır, yani kendi rolleri arasında bir ilişki vardır.

Ted'i işverenine bağlamak için beş tablo birleştirildi. Tüm çalışanların Kişi (organizasyon değil) olduğunu varsayar ve bu yardımcı görünümü sağlarsınız:

CREATE VIEW vw_employee AS
SELECT p.title, p.given_names, p.surname, p.date_of_birth, p2.party_name employer_name
FROM person p
JOIN party py ON py.id = p.id
JOIN party_role child ON p.id = child.party_id
JOIN party_role_relationship prr ON child.id = prr.child_id AND prr.type = 'EMPLOYMENT'
JOIN party_role parent ON parent.id = prr.parent_id = parent.id
JOIN party p2 ON parent.party_id = p2.id

Ve aniden, çok esnek bir veri modelinde istediğiniz verileri çok basit bir şekilde görebilirsiniz.

7. Girişi sterilize etmiyor

Bu çok büyük. Şimdi PHP'yi seviyorum ama ne yaptığınızı bilmiyorsanız saldırılara karşı savunmasız siteler oluşturmak gerçekten çok kolay. Hiçbir şey küçük Bobby Tables'ın hikayesinden daha iyi özetleyemez .

Kullanıcı tarafından URL'ler, form verileri ve çerezler aracılığıyla sağlanan veriler her zaman düşmanca ve dezenfekte edilmiş olarak ele alınmalıdır. Beklediğinizi aldığınızdan emin olun.

8. Hazırlanan ifadeleri kullanmamak

Hazırlanan ifadeler, ekler, güncelleştirmeler ve WHEREyan tümcelerinde kullanılan verileri eksi bir sorgu derleyip derledikten sonra bunu daha sonra sağladığınız zamandır. Örneğin:

SELECT * FROM users WHERE username = 'bob'

vs

SELECT * FROM users WHERE username = ?

veya

SELECT * FROM users WHERE username = :username

platformunuza bağlı olarak.

Bunu yaparak veritabanlarının dizlerine getirildiğini gördüm. Temel olarak, herhangi bir modern veritabanı yeni bir sorgu ile her karşılaştığında onu derlemek zorundadır. Daha önce gördüğü bir sorgu ile karşılaşırsa, veritabanına derlenmiş sorguyu ve yürütme planını önbelleğe alma fırsatı verirsiniz. Sorguyu çok yaparak veritabanına bunu bulma ve buna göre optimize etme fırsatı vermiş olursunuz (örneğin, derlenmiş sorguyu belleğe sabitleyerek).

Hazırlanan ifadeleri kullanmak, belirli sorguların ne sıklıkta kullanıldığına ilişkin anlamlı istatistikler de verir.

Hazırlanan ifadeler sizi SQL enjeksiyon saldırılarına karşı daha iyi koruyacaktır.

9. Yeterince normalleşmeme

Veritabanı normalizasyonu temel olarak veritabanı tasarımını optimize etme veya verilerinizi tablolar halinde nasıl düzenlediğinizdir.

Sadece bu hafta birisi bir dizi imploded ve bir veritabanındaki tek bir alana eklenmiş bazı kod üzerinde koştu. Bunu normalleştirmek, o dizinin elemanını bir alt tabloda ayrı bir satır olarak ele almak olacaktır (yani bir-çok ilişkisi).

Bu aynı zamanda kullanıcı kimlikleri listesini saklamak için En İyi yöntemde de ortaya çıktı :

Diğer sistemlerde listenin serileştirilmiş bir PHP dizisinde saklandığını gördüm.

Ancak normalleşme eksikliği birçok şekilde ortaya çıkar.

Daha:

10. Çok fazla normalleştirme

Bu, önceki noktaya bir çelişki gibi görünebilir, ancak normalleştirme, birçok şey gibi, bir araçtır. Bu kendi başına bir amaç değil, bir amaçtır. Bence birçok geliştirici bunu unutuyor ve “araçlara” “son” gibi davranmaya başlıyor. Birim testi bunun en iyi örneğidir.

Bir keresinde, müşteriler için büyük bir hiyerarşiye sahip bir sistem üzerinde çalıştım:

Licensee ->  Dealer Group -> Company -> Practice -> ...

böylece anlamlı veriler elde edebilmek için yaklaşık 11 masaya katılmak zorunda kaldınız. Çok ileri götürülen normalleşmenin iyi bir örneğiydi.

Daha da önemlisi, dikkatli ve denormalizasyonun büyük performans faydaları olabilir, ancak bunu yaparken gerçekten dikkatli olmalısınız.

Daha:

11. Özel yayların kullanılması

Özel ark, bir tablonun iki veya daha fazla yabancı anahtarla oluşturulduğu yaygın bir hatadır ve bunlardan sadece bir tanesi boş olamaz. Büyük hata. Birincisi, veri bütünlüğünü korumak çok daha zorlaşıyor. Sonuçta, referans bütünlüğünde bile, bu yabancı anahtarların iki veya daha fazlasının ayarlanmasını engelleyecek hiçbir şey yoktur (buna rağmen karmaşık kontrol kısıtlamaları).

Gönderen İlişkisel Veritabanı Tasarım Pratik Rehber :

Mümkün olan her yerde özel ark yapımına karşı şiddetle tavsiye ettik, bunun nedeni kod yazmak ve daha fazla bakım zorluğu yaratmak için garip olabilirler.

12. Sorgularda performans analizi yapmamak

Pragmatizm özellikle veritabanı dünyasında yüce hüküm sürer. İlkeleri bir dogma haline geldikleri noktaya bağlıyorsanız, büyük olasılıkla hata yaptınız. Yukarıdaki toplu sorguların örneğini ele alalım. Toplu sürüm "hoş" görünebilir, ancak performansı sıkıntılıdır. Performans karşılaştırması tartışmayı bitirmişti (ama bitmedi) ama daha da önemlisi: bu tür bilgisiz görüşlerin ilk etapta verilmesi cahil, hatta tehlikeli.

13. UNION ALL ve özellikle UNION yapılarına aşırı güvenme

SQL terimlerindeki bir BİRLİK sadece uyumlu veri kümelerini birleştirir, yani aynı tür ve sütun sayısına sahiptir. Aralarındaki fark, UNION ALL'un basit bir birleştirme olması ve mümkün olan her yerde tercih edilmesi gerektiğidir, oysa bir UNION örtük olarak çiftleri çıkarmak için bir DISTINCT yapacaktır.

DISTINCT gibi sendikaların da yeri var. Geçerli uygulamalar var. Ancak kendinizi, özellikle alt sorgularda çok şey yaparken bulursanız, muhtemelen yanlış bir şey yapıyorsunuzdur. Bu, kötü sorgu oluşturma veya sizi böyle şeyler yapmaya zorlayan kötü tasarlanmış bir veri modeli olabilir.

UNION'lar, özellikle birleştirme veya bağımlı alt sorgularda kullanıldığında, bir veritabanını sakatlayabilir. Mümkün olduğunca onlardan kaçınmaya çalışın.

14. Sorgularda VEYA koşullarını kullanma

Bu zararsız görünebilir. Sonuçta, AND'ler iyi. VEYA çok iyi olmalı mı? Yanlış. Temel olarak bir VE koşulu veri kümesini kısıtlarken bir VEYA koşulu onu büyütür , ancak optimizasyona uygun bir şekilde değil. Özellikle farklı OR koşulları kesişebildiğinde, optimize ediciyi sonuç üzerinde bir DISTINCT operasyonuna etkili bir şekilde zorlamaya zorladığında.

Kötü:

... WHERE a = 2 OR a = 5 OR a = 11

Daha iyi:

... WHERE a IN (2, 5, 11)

Şimdi SQL optimize ediciniz ilk sorguyu etkili bir şekilde ikinciye çevirebilir. Ama olmayabilir. Sadece yapma.

15. Veri modellerini yüksek performanslı çözümlere uyum sağlayacak şekilde tasarlamamak

Bunu ölçmek zor bir nokta. Genellikle etkisi ile gözlenir. Kendinizi nispeten basit görevler için gnarly sorgular yazarken bulursanız veya nispeten basit bilgiler bulmak için sorgular etkili olmazsa, muhtemelen zayıf bir veri modeliniz vardır.

Bazı açılardan bu nokta daha öncekileri özetlemektedir, ancak sorgu optimizasyonu gibi şeyler yapmanın genellikle ilk yapılması gerektiğinde ilk önce yapılması gereken bir uyarıcı masaldır. Her şeyden önce, performansı optimize etmeye çalışmadan önce iyi bir veri modeline sahip olduğunuzdan emin olmalısınız. Knuth'un dediği gibi:

Erken optimizasyon tüm kötülüklerin köküdür

16. Veritabanı İşlemlerinin Yanlış Kullanımı

Belirli bir işlem için tüm veri değişiklikleri atomik olmalıdır. Yani işlem başarılı olursa, tam olarak gerçekleşir. Başarısız olursa veriler değişmeden kalır. - 'Yarı bitmiş' değişiklik olasılığı olmamalıdır.

İdeal olarak, bunu başarmanın en basit yolu, tüm sistem tasarımının tüm veri değişikliklerini tek bir INSERT / UPDATE / DELETE deyimi aracılığıyla desteklemeye çalışmasıdır. Bu durumda, veritabanı motorunuzun otomatik olarak yapması gerektiği için özel bir işlem işlemeye gerek yoktur.

Bununla birlikte, herhangi bir işlem, verileri tutarlı bir durumda tutmak için bir birim olarak birden fazla ifade yapılmasını gerektiriyorsa, uygun İşlem Denetimi gereklidir.

  • İlk ifadeden önce bir İşlem başlatın.
  • İşlemi son ifadeden sonra yapın.
  • Herhangi bir hata durumunda, İşlemi Geri Al. Ve çok NB! Hatadan sonra gelen tüm ifadeleri atlamayı / iptal etmeyi unutmayın.

Ayrıca, veritabanı bağlantı katmanınızın ve veritabanı motorunuzun bu bağlamda nasıl etkileşime girdiğine dikkat etmenizi öneririz.

17. 'Kümeye dayalı' paradigmayı anlamamak

SQL dili, belirli türdeki sorunlara uygun belirli bir paradigmayı izler. Çeşitli satıcıya özgü uzantılar buna rağmen, dil Java, C #, Delphi vb.

Bu anlayış eksikliği kendini birkaç şekilde gösterir.

  • Veritabanına uygunsuz bir şekilde çok fazla prosedürel veya zorunlu mantık dayatılması.
  • İmleçlerin uygunsuz veya aşırı kullanımı. Özellikle tek bir sorgu yeterli olduğunda.
  • Çok satırlı güncellemelerden etkilenen satır başına bir kez ateşleme tetiklendiğini varsayarsak.

Açık bir sorumluluk bölümü belirleyin ve her sorunu çözmek için uygun aracı kullanmaya çalışın.


9
Yabancı anahtarlarla ilgili MySQL ifadelerinde, MyISAM'ın bunları desteklemediğini haklıyorsunuz, ancak yalnızca MyISAM kullanmanın kötü tasarım olduğunu ima ediyorsunuz. MyISAM'ı kullanmamın bir nedeni, InnoDB'nin FullText aramalarını desteklememesidir ve bunun mantıksız olduğunu düşünmüyorum.
Derek H

1
# 6 hakkında soru sormak zorundayım. Bunun gibi görünümleri kullanmak benim en sevdiğim şeylerden biri, ama son zamanlarda dehşetime, altta yatan tablolardaki MySQL dizinleri ile sadece görünümün yapısı birleştirme algoritmasının kullanılmasına izin veriyorsa uyulduğunu öğrendim. Aksi takdirde, geçici tablo kullanılır ve tüm dizinleriniz işe yaramaz. Bir grup işlemin bu davranışa neden olduğunu fark ettiğinizde daha da endişe verici. .01 saniyelik bir sorguyu 100 saniyeye dönüştürmek için harika bir yoldur. Burada başka biri bununla ilgili deneyime sahip mi? Bir sonraki yorumumdaki bağlantıları kontrol et.
Peter Bailey

5
# 3 ile tamamen aynı fikirde değilim. Evet, ülkeler var olabilir, ancak ülke kodu aynı şeyi temsil etmeye devam edecektir. Para birimi kodları veya ABD Devletleri ile aynı. Bu durumlarda bir yedek anahtar kullanmak aptalcadır ve fazladan birleştirme eklemeniz gerektiğinden, sorgularınızda daha fazla ek yük oluşturur. Ben bunu senden daha güvenli olduğunu söyleyebilirim muhtemelen kullanıcıya özgü veri (dolayısıyla değil ülkeler, para birimleri ve ABD Devletleri) için, suret kullanmalisin.
Thomas

1
RE: # 11 Veri bütünlüğünü sağlamak için gerekli olan kontrol kısıtlaması önemsizdir. Bu tasarımdan kaçınmanın başka nedenleri de vardır, ancak "karmaşık" kontrol kısıtlamasına duyulan ihtiyaç bunlardan biri değildir.
Thomas

2
# 3 ile dürüst olmuyorsun. Yapay anahtarın "buna ihtiyacınız olmayabilir" den daha fazla dezavantajı vardır. Özellikle, doğal bir anahtar kullanmak, tablonuzdaki verilerin diske yazılma sırasını kontrol etme olanağı verecektir. Tablonuzun nasıl sorgulanacağını biliyorsanız, eşzamanlı olarak erişilen satırlar aynı sayfada sonuçlanacak şekilde dizine ekleyebilirsiniz. Ayrıca, benzersiz bir bileşik dizin kullanarak veri bütünlüğünü zorunlu kılabilirsiniz. Buna ihtiyacınız varsa, yapay anahtar dizininize ek olarak eklemeniz gerekir. Eğer söz konusu bileşik endeks anahtarınızsa, bir taşla öldürülen 2 kuştur.
Shane H

110

Geliştiriciler tarafından yapılan temel veritabanı tasarımı ve programlama hataları

  • Bencil veritabanı tasarımı ve kullanımı. Geliştiriciler, veriyi diğer paydaşların ihtiyaçlarını dikkate almadan veritabanını genellikle kişisel kalıcı nesne deposu olarak görürler. Bu aynı zamanda uygulama mimarları için de geçerlidir. Kötü veritabanı tasarımı ve veri bütünlüğü, verilerle çalışan üçüncü tarafların işini zorlaştırır ve sistemin yaşam döngüsü maliyetlerini önemli ölçüde artırabilir. Raporlama ve YBS uygulama tasarımında zayıf bir kuzen olma eğilimindedir ve sadece sonradan düşünülerek yapılır.

  • Denormalize edilmiş verilerin kötüye kullanılması. Denormalize edilmiş verileri abartmak ve uygulama içinde tutmaya çalışmak veri bütünlüğü sorunları için bir reçetedir. Denormalizasyonu idareli kullanın. Bir sorguya birleştirme eklemek istememek, normalleştirme için bir bahane değildir.

  • SQL yazmaktan korkuyorum. SQL roket bilimi değildir ve aslında işini yapmakta oldukça iyidir. O / R eşleme katmanları, basit ve bu modele iyi uyan sorguların% 95'ini yapmakta oldukça iyidir. Bazen SQL işi yapmanın en iyi yoludur.

  • Dogmatic 'Saklı Yordam Yok' politikaları. Saklı yordamların kötü olup olmadığına bakılmaksızın, bu tür dogmatik tutumun bir yazılım projesinde yeri yoktur.

  • Veritabanı tasarımını anlamamak. Normalleştirme senin arkadaşın ve roket bilimi değil. Birleştirme ve kardinalite oldukça basit kavramlardır - eğer veritabanı uygulaması geliştirmeyle ilgileniyorsanız, onları anlamadığınız için hiçbir mazeret yoktur.


2
İşlemlerin işlemsel veri tabanında yapılması ve raporlama ile YBS'nin ayrı bir analiz veri tabanında yapılması gerektiği söylenebilir. Bu nedenle her iki dünyanın en iyisini elde edersiniz ve herkes mutludur (ikincisini oluşturmak için veri dönüştürme komut dosyasını yazmak zorunda olan fakir kupa hariç).
Chris Simpson

Sadece ETL'yi yazan fakir kupa değil - sistemden veri kullanan herkes, MIS uygulamasındaki düşük kaliteli veriler kutudadır, çünkü birkaç anahtar ilişki aslında kaynağa kaydedilmez, sonsuz uzlaşma bun-fignts'ına katılan herkes düşük veri kalitesinden
ConcernedOfTunbridgeWells

Birinci noktaya daha fazla katılmıyorum. Veritabanları kalıcılık içindir, süreçler arası iletişim için değildir. Bu soruna neredeyse her zaman daha iyi çözümler vardır. Bunun için açık bir gereksinim olmadıkça, veritabanına, uygulamanız dışında hiç kimse bunu kullanmayacakmış gibi davranmalısınız. Açık bir gereksinim olsa bile, üzerinde bazı kullanıcı hikayesi ve kök neden analizi yapın ve talep eden kişinin niyetini doldurmanın çok daha iyi bir yolunu keşfedeceksiniz. Sonra tekrar, CQRS ifadesinin biraz yaygın olduğu bir şirkette çalışıyorum
George Mauer

3
Önemsiz örnek: Bir sigorta poliçesi yönetim sistemim var ve potansiyel geri kazanımları hesaplamak için 5 milyon talep durumunu onaylı bir reasürans sistemine yüklemem gerekiyor. Sistemler, daha eski ana bilgisayar sistemlerine bile arabirim oluşturmak üzere tasarlanmış eski istemci-sunucu COTS paketleridir. Her ikisi de mali kontrol amacıyla uzlaştırılmalıdır. Bu iş ayda bir kez yapılır. Mantığınıza göre, gereksinimleri tanımlayan bir dizi kullanıcı hikayesi yazarım ve satıcılardan mevcut ürünlerine bir web hizmeti sarmalayıcı eklemesi için teklif vermelerini isterdim.
ConcernedOfTunbridgeWells

2
O zaman DBA'nız ya tembel ya da yetersizdir.
ConcernedOfTunbridgeWells

80
  1. Veritabanı şemasında sürüm denetimi kullanılmıyor
  2. Canlı bir veritabanında doğrudan çalışma
  3. Daha gelişmiş veritabanı kavramlarını (dizinler, kümelenmiş dizinler, kısıtlamalar, somutlaştırılmış görünümler vb.) Okumamak ve anlamak
  4. Ölçeklenebilirlik testi yapılamıyor ... yalnızca 3 veya 4 satırlık test verileri size hiçbir zaman gerçek canlı performansın gerçek resmini vermez

1
İkincisi, ağır, # 1 ve # 2. Ne zaman DB bir değişiklik yapmak onun şeması dökümü ve sürüm; Ben üç veritabanları kurulum var, bir dev bir, bir evreleme ve canlı bir - HİÇBİR ŞEY hiç canlı DB "test" alır!
Ixmatus

Red Gate'te SQL Source Control ile ilk noktanızı geliştirmek için adımlar attık! Araştırmam sırasında yaptığım konuşmalardan insanların artık üretim veritabanlarına karşı gelişmediğini düşünüyorum, ancak genellikle başka bir konu olan kalkınma ortamlarına geri dönüş yollarını bulan "acil durum" düzeltmeleri yapılıyor.
David Atkinson

46

Aşırı kullanım ve / veya saklı prosedürlere bağımlılık.

Bazı uygulama geliştiricileri, saklı yordamları orta katman / ön uç kodunun doğrudan uzantısı olarak görür. Bu, Microsoft yığın geliştiricilerinde ortak bir özellik gibi görünüyor (ben birim, ancak büyüdüm) ve karmaşık iş mantığı ve iş akışı işleme gerçekleştiren birçok saklı yordam üretiyor. Bu başka bir yerde daha iyi yapılır.

Saklı yordamlar, bazı gerçek teknik faktörlerin (örneğin performans ve güvenlik) kullanımını gerektirdiğinin kanıtlandığı durumlarda yararlıdır. Örneğin, büyük veri kümelerinin toplanmasını / filtrelenmesini "verilere yakın" tutmak.

Son zamanlarda, iş mantığı ve kurallarının% 70'inin 1400 SQL Server saklı yordamında (kalan kullanıcı arabirimi olay işleyicilerinde) uygulandığı büyük bir Delphi masaüstü uygulamasının korunmasına ve geliştirilmesine yardımcı olmak zorundaydım. Bu, esasen TSQL'e etkili birim testi yapma, kapsülleme eksikliği ve zayıf araçların (Hata ayıklayıcılar, editörler) zorluğu nedeniyle bir kabustu.

Geçmişte bir Java ekibiyle çalışırken çabucak tam tersinin o ortamda bulunduğunu öğrendim. Bir Java Mimarı bana bir keresinde şöyle demişti: "Veritabanı kod değil veri içindir."

Bu günlerde saklı procları hiç dikkate almamanın bir hata olduğunu düşünüyorum, ancak yararlı faydalar sağladıkları durumlarda (varsayılan olarak değil) az miktarda kullanılmalıdırlar (diğer cevaplara bakın).


4
Saklı yordamlar, kullanıldıkları herhangi bir projede bir incinme adası olma eğilimindedir, bu nedenle bazı geliştiriciler "Saklı yordam yok" kuralı oluşturur. Görünüşe göre, aralarında açık bir çatışma var gibi görünüyor. Cevabınız gerçekte bir yoldan veya diğerinden ne zaman seçeceğiniz için iyi bir durumdur.
Warren P

Avantajlar: güvenlik - uygulamalara "... 'dan * silme" yeteneği vermek zorunda değilsiniz; ince ayarlar - DBA'lar tüm uygulamayı yeniden derlemek / dağıtmak zorunda kalmadan sorguları değiştirebilir; analiz - hala geçerli olduklarından emin olmak için bir veri modeli değişikliğinden sonra bir grup proku yeniden derlemek kolaydır; ve son olarak, SQL veritabanı motoru (uygulamanız değil) tarafından yürütülürse, "veritabanı veri içindir, kod değil" kavramı sadece geciktirilir.
NotMe

Yani, iş mantığınızı, manipüle edilen verilerden boşaltılan kullanıcı arayüzüne dahil edersiniz? Bu, özellikle veri manipülasyonu, UI'den gidiş-dönüşler yerine veritabanı sunucusu tarafından gerçekleştirildiğinde en verimli olduğu için iyi bir fikir gibi görünmüyor. Bu, aynı zamanda uygulamayı kontrol etmenin daha zor olduğu anlamına gelir çünkü veritabanının verilerini kontrol etmesine güvenemezsiniz ve potansiyel olarak farklı veri manipülasyonları devam eden bir kullanıcı arayüzünün farklı sürümlerine sahip olabilirsiniz. İyi değil. Saklı yordam dışında hiçbir şeyin verilerime dokunmasına izin vermiyorum.
David T. Macknet

İş mantığının kullanıcı arayüzünden ayrılmasına ihtiyaç varsa, çok katmanlı mimariler kullanılabilir. Veya farklı uygulamalar / arayüzler tarafından kullanılan iş nesneleri ve mantığı olan bir kütüphane. Saklı yordamlar verilerinizi / iş mantığınızı belirli bir veritabanına kilitler, bu durumda bir veritabanını değiştirmek çok maliyetlidir. Ve büyük maliyet kötü.
çok

@too: Çoğu durumda bir veritabanını değiştirmek çok masraflıdır. Boşver, belirli bir DBMS'nin sağladığı performans ve güvenlik özelliklerini kaybetme fikri. Ayrıca, ek katmanlar karmaşıklık ekler ve performansı azaltır ve ek katmanlar kendi dilinize bağlanır. Son olarak, kullanılan dilin bir veritabanı sunucusundan daha fazla değişmesi muhtemeldir.
NotMe

41

Bir numaralı sorun mu var? Sadece oyuncak veritabanlarında test ederler. Bu yüzden, veritabanı büyük olduğunda SQL'lerinin taranacağına dair bir fikirleri yoktur ve birisi gelip daha sonra düzeltmek zorundadır (duyabileceğiniz ses dişlerimin taşlanmasıdır).


2
Veritabanının boyutu önemlidir, ancak daha büyük bir sorun yüklenir - gerçek bir veri kümesinde test etseniz bile, veritabanı gerçek bir göz açıcı olabilecek bir üretim yükü altındayken sorgularınızın performansını test etmezsiniz.
davidcl

Veritabanı boyutu yük daha büyük bir sorun olduğunu söyleyebilirim. Birçok kez gördüm, önemli dizinler eksikti - testler sırasında hiçbir zaman performans sorunu olmadı, çünkü tüm veritabanı belleğe
sığdı


28

İlişkili Alt Sorguların Neden Olduğu Düşük Performans

Çoğu zaman ilişkili alt sorgulardan kaçınmak istersiniz. Alt sorgu içinde, dış sorgudan bir sütuna başvuru varsa bir alt sorgu ilişkilendirilir. Bu olduğunda, alt sorgu döndürülen her satır için en az bir kez yürütülür ve ilişkili alt sorguyu içeren koşul uygulandıktan sonra başka koşullar uygulanırsa daha fazla yürütülür.

Anlaşılan örneği ve Oracle sözdizimini affedin, ancak diyelim ki mağaza bir günde son zamanlarda 10.000 ABD dolarından az satış yaptı.

select e.first_name, e.last_name
from employee e
where e.start_date > 
        (select max(ds.transaction_date)
         from daily_sales ds
         where ds.store_id = e.store_id and
               ds.total < 10000)

Bu örnekteki alt sorgu, store_id tarafından dış sorgu ile ilişkilendirilir ve sisteminizdeki her çalışan için yürütülür. Bu sorgunun optimize edilmesinin bir yolu, alt sorguyu satır içi görünüme taşımaktır.

select e.first_name, e.last_name
from employee e,
     (select ds.store_id,
             max(s.transaction_date) transaction_date
      from daily_sales ds
      where ds.total < 10000
      group by s.store_id) dsx
where e.store_id = dsx.store_id and
      e.start_date > dsx.transaction_date

Bu örnekte, from yan tümcesindeki sorgu artık bir satır içi görünümdür (yine bazı Oracle'a özgü sözdizimi) ve yalnızca bir kez yürütülür. Veri modelinize bağlı olarak, bu sorgu muhtemelen çok daha hızlı yürütülür. Çalışan sayısı arttıkça ilk sorgudan daha iyi performans gösterecektir. Az sayıda çalışan ve çok sayıda mağaza (ve belki de mağazaların çoğunda hiç çalışanı bulunmamışsa) ve daily_sales tablosu store_id'de dizine eklenmişse ilk sorgu aslında daha iyi performans gösterebilir. Bu olası bir senaryo değildir, ancak ilişkili bir sorgunun bir alternatiften daha iyi nasıl performans gösterebileceğini gösterir.

Küçük geliştiricilerin alt sorguları birçok kez ilişkilendirdiklerini gördüm ve genellikle performans üzerinde ciddi bir etkisi oldu. Bununla birlikte, ilişkili bir alt sorguyu kaldırırken , performansı daha da kötüleştirmediğinizden emin olmak için önce ve sonra açıklama planına baktığınızdan emin olun.


1
Harika bir nokta ve ilgili noktalarınızdan birini vurgulamak için - değişikliklerinizi test edin. Açıklama planlarını kullanmayı öğrenin (ve sorgunuzu yürütmek için veritabanının gerçekten ne yaptığını ve maliyetini görün), testlerinizi büyük bir veri kümesinde yapın ve SQL'inizi bir optimizasyon için aşırı karmaşık ve okunamaz / sürdürülemez hale getirmeyin bu aslında gerçek performansı iyileştirmez.
Rob Whelan

21

Deneyimlerime göre:
Deneyimli DBA'lar ile iletişim kurmamak.


17

"Gerçek" bir veritabanı yerine Access'i kullanma. SQL Express , MySQL ve SQLite gibi çok daha iyi çalışacak ve ölçeklendirilecek çok sayıda küçük ve hatta ücretsiz veritabanı vardır . Uygulamaların genellikle beklenmedik şekillerde ölçeklendirilmesi gerekir.


16

Tablolar arasında ilişki kurmayı unutmak. Mevcut işverenimde çalışmaya başladığımda bunu temizlemem gerektiğini hatırlıyorum.


14

(Büyük miktarlarda) veri depolamak için Excel'i kullanma.

Binlerce satır tutan ve birden çok çalışma sayfası kullanan şirketler gördüm (önceki Excel sürümlerinde 65535 satır sınırı nedeniyle).


Excel raporlar, veri sunumu ve diğer görevler için çok uygundur, ancak veritabanı olarak ele alınmamalıdır.


14

Eklemek istiyorum: Yüksek performans kod üzerinde "Zarif" kodu tercih. Veritabanlarına karşı en iyi çalışan kod genellikle uygulama geliştiricisinin gözünde çirkin.

Erken optimizasyon konusunda bu saçmalıklara inanmak. Veritabanları, özgün tasarımdaki ve sonraki geliştirmelerdeki performansı dikkate almalıdır. Performans, veritabanı tasarımının% 50'sidir (% 40 veri bütünlüğü ve son% 10 güvenlik). Gerçek kullanıcılar ve gerçek trafik veritabanına yerleştirildikten sonra aşağıdan yukarıya doğru oluşturulmayan veritabanları kötü performans gösterecektir. Erken optimizasyon, optimizasyon olmadığı anlamına gelmez! Bu, daha kolay bulduğunuz için neredeyse her zaman kötü performans gösterecek bir kod yazmanız gerektiği anlamına gelmez (örneğin, imleçler, başka bir şey başarısız olmadıkça üretim veritabanında asla izin verilmemelidir). Bu, ihtiyacınız olana kadar son performansın biraz sıkılmasına bakmanıza gerek olmadığı anlamına gelir. Veritabanlarında neyin daha iyi performans göstereceği hakkında çok şey bilinir,


2
+1 - Veritabanı programlama, mekanik bileşenlerin davranışını optimize etmeyi içerir. Bununla birlikte, Knuth'un erken optimizasyonun, zamanın yaklaşık% 97'sinin (veya bu etkiye ait kelimelerin) tüm kötülüğün kökü olduğunu söylediğini unutmayın. Veritabanı tasarımı, bu konuda gerçekten düşünmeniz gereken bir alandır.
Söz konusuOfTunbridgeWells

2
Ahem ... bahsettiğin şey erken olmayan optimizasyon. Veri tabanı tasarımında (ve uygulama tasarımında) gerçek kullanımın bir miktar dikkate alınması gerekmektedir. Knuth'un kuralını takip etmek aslında önemsiz değildir, çünkü neyin erken ve neyin olmadığına karar vermeniz gerekir - gerçekten "veri olmadan optimizasyon yapma" ya gelir. Konuşmaya başladıktan erken performansa ilgili kararlar hakkında sahip verileri - Belirli tasarımları gelecekteki performansı üzerinde kabul edilemez sınırlar koyacaktır ve bunları hesaplayabilirsiniz.
Rob Whelan

13

Parametreli sorgular kullanılmıyor. SQL Injection'ı durdurmada oldukça kullanışlıdır .

Bu, başka bir cevapta bahsedilen girdi verilerinin sterilize edilmemesinin spesifik bir örneğidir.


3
Dezenfekte etme girişi yanlış. Dezenfekte etme, tehlikeli olabileceği bir yere koymak anlamına gelir. Parametrelendirme, onu tamamen zarar yolundan uzak tutmak anlamına gelir.
Dustin

12

Geliştiriciler yuvalanmış select deyimlerini kullandığında veya hatta bir sorgunun "SELECT" bölümündeki bir select deyiminin sonucunu döndürdüğünde nefret ediyorum.

Aslında burada başka bir yerde görmüyorum şaşırdım, belki de göz ardı, @adam benzer bir sorun belirtilmiş olmasına rağmen.

Misal:

SELECT
    (SELECT TOP 1 SomeValue FROM SomeTable WHERE SomeDate = c.Date ORDER BY SomeValue desc) As FirstVal
    ,(SELECT OtherValue FROM SomeOtherTable WHERE SomeOtherCriteria = c.Criteria) As SecondVal
FROM
    MyTable c

Bu senaryoda, MyTable 10000 satır döndürürse, sonuç, ilk sorgu artı her sonuç satırı için diğer tabloların her birini bir kez sorgulaması gerektiği için sorgunun sadece 20001 sorgusunu çalıştırdığı gibidir.

Geliştiriciler bu çalışmayla sadece birkaç satır veri döndürdükleri ve alt tabloların genellikle çok az miktarda verilere sahip olduğu bir geliştirme ortamında kurtulabilirler, ancak bir üretim ortamında bu tür bir sorgu daha fazla katlanabilir veriler tablolara eklenir.

Daha iyi (mutlaka mükemmel olmayan) bir örnek şöyle olacaktır:

SELECT
     s.SomeValue As FirstVal
    ,o.OtherValue As SecondVal
FROM
    MyTable c
    LEFT JOIN (
        SELECT SomeDate, MAX(SomeValue) as SomeValue
        FROM SomeTable 
        GROUP BY SomeDate
     ) s ON c.Date = s.SomeDate
    LEFT JOIN SomeOtherTable o ON c.Criteria = o.SomeOtherCriteria

Bu veritabanı en iyileştiriciler ana tablodan her kayıt yeniden sorgulamak yerine, birlikte veri karıştırmak sağlar ve genellikle bu sorunun oluşturulduğu yerde kodu düzeltmek zorunda kaldığımda bulmak, genellikle sorgu hızını% 100 veya aynı anda CPU ve bellek kullanımını azaltır.


12

SQL tabanlı veritabanları için:

  1. CLUSTERED INDEXES'ten yararlanmamak veya CLUSTER için yanlış sütunları seçmek.
  2. Bir üst / alt tablo ilişkisinde bir YABANCI ANAHTAR (INT) katılmak için bir birincil anahtar olarak bir seri (otomatik sayı) veri türü kullanmıyorum.
  3. Birçok kayıt eklendiğinde veya SİLDİĞİNDE bir tablodaki İSTATİSTİKLERİ GÜNCELLEME.
  4. Çok sayıda satır eklendiğinde veya silindiğinde tabloları yeniden düzenlemez (yani boşaltma, bırakma, yeniden oluşturma, yükleme ve yeniden endeksleme) (bazı motorlar silinmiş satırları silme işaretli bir tabloda fiziksel olarak tutar.)
  5. Yüksek işlem oranlarına sahip büyük masalarda İFADE ÜZERİNDEKİ PARFÜM'den (destekleniyorsa) yararlanmamak.
  6. Bir sütun için yanlış veri türü seçme!
  7. Uygun bir sütun adı seçmemek.
  8. Tablonun sonuna yeni sütunlar eklenmiyor.
  9. Sık kullanılan sorguları desteklemek için uygun dizinler oluşturmamak.
  10. birkaç olası değere sahip sütunlarda dizin oluşturma ve gereksiz dizinler oluşturma.
    ... daha fazlası eklenecek.

1
Bir kelime oyunu: 2) aslında kötü bir uygulamadır. Neye ulaştığınızı görüyorum - otonumda benzersiz bir dizin ve bunu yedek anahtar olarak kullanmak istiyorsunuz. Ancak birincil anahtar bir bağımsız sayı olmamalıdır, çünkü birincil anahtarın ne olduğu değildir: birincil anahtar "kaydın ne olduğu" dır (satış işlemleri gibi şeyler hariç) otomatik sayı değil, benzersiz bir bittir modellenen varlık hakkında bilgi.
David T. Macknet

birincil ve yabancı anahtar için otomatik numara kullanmanın temel nedeni, diğer herhangi bir sütundaki değişikliklerden bağımsız olarak bir ebeveyn-çocuk birleştirmesinin korunabilmesini sağlamaktır. müşteri adı veya diğer veriler gibi farklı bir birincil anahtar kullanmak riskli olabilir!
Frank R.

@David: Düzeltildiğimde duruyorum! .. otonumayı birincil anahtar olarak kullanmak gerekli değildir, yine de ebeveynte dizinlenmiş bir seri sütun olabilir, ilişkinin kesilmeyeceğini garanti etmek için çocukta vekil bir araya gelebilir sütun bulmak için anlamlı bir birincil olarak sütun!
Frank R.10

Günün sonunda bir anlambilim meselesi ... ve Microsoft birincil anahtarların anlamlı olmaktan ziyade anlamsız olmasını tercih ediyor. Etrafındaki tartışmalar sürüyor, ama ben "anlamlı" kampa düşüyorum. :)
David T. Macknet

9
  • Üretim veritabanındaki bazı sorunları gidermeden yedek almamak.

  • Saklı yordamlarda depolanan nesnelerde (tablolar, görünümler gibi) DDL komutlarını kullanma.

  • Depolanmış proc kullanma korkusu veya ORM sorgularını kullanmak için daha verimli / uygun olan yerlerde kullanma korkusu.

  • ORM sorgunuzun neye dönüştürüldüğünü tam olarak anlatabilecek ve dolayısıyla mantığı doğrulayabilecek ve hatta ORM kullanmadığınızda hata ayıklayabileceğiniz bir veritabanı profillerinin kullanımını yok saymak.


8

Doğru normalleştirme seviyesini yapmamak . Verilerin çoğaltılmadığından ve verileri gerektiği gibi farklı bir şekilde böldüğünüzden emin olmak istiyorsunuz. Ayrıca , performansı olumsuz etkileyeceği için normalleştirmeyi çok fazla takip etmediğinizden emin olmanız gerekir .


Ne kadar uzak? Hiçbir veri kopyalanmazsa, nasıl daha ileri gidebilirsiniz?
finnw

Normalleştirme, gereksiz verilerin kaldırılması ile azaltılmış performans ve artan karmaşıklık karşısında esnekliğin artırılması dengesidir. Doğru dengeyi bulmak deneyim gerektirir ve zamanla değişir. Ne zaman denormalize
edileceği

8

Veritabanına sadece bir depolama mekanizması (örn. Yüceltilmiş koleksiyonlar kütüphanesi) olarak davranılması ve dolayısıyla bunların uygulamalarına tabi tutulması (verileri paylaşan diğer uygulamaları göz ardı ederek)


Bunun bir sonucu, ait olduğu db'de tutmak yerine uygulamaya çok fazla sorgu çalışması yükü boşaltmaktır. LINQ bu konuda özellikle kötüdür.
3Dave

8
  • Kontrolden, "olmamasına "Çok büyülü" veya benzeri nedenlerle hazırda gibi bir ORM reddeden benim veritabanında".
  • Hazırda Bekleme gibi bir ORM'ye çok fazla güvenmek ve uygun olmayan yerlerde ayakkabı çekmeye çalışmak.

8

1 - Gereksiz olarak, burada kullanılan bir dizinin değerinin kullanılmadığı bir değerde bir işlev kullanmak.

Misal:

where to_char(someDate,'YYYYMMDD') between :fromDate and :toDate

onun yerine

where someDate >= to_date(:fromDate,'YYYYMMDD') and someDate < to_date(:toDate,'YYYYMMDD')+1

Ve daha az ölçüde: İhtiyacı olan değerlere fonksiyonel indeksler eklememek ...

2 - Verilerin geçerliliğini sağlamak için kontrol kısıtlamaları eklememek. Kısıtlamalar sorgu optimize edici tarafından kullanılabilir ve GERÇEKTEN değişmezlerinize güvenebileceğinizden emin olmanıza yardımcı olur. Onları kullanmamak için hiçbir neden yok.

3 - Saf tembellik veya zaman baskısı dışında tablolara normalleştirilmemiş sütunlar ekleme. İşler genellikle bu şekilde tasarlanmaz, ancak buna dönüşür. Nihai sonuç, başarısız olmadan, gelecekteki evrimlerdeki kayıp veri bütünlüğünden ısırdığınızda karışıklığı temizlemeye çalışan bir ton çalışmadır.

Bunu düşünün, veri içermeyen bir tabloyu yeniden tasarlamak çok ucuzdur. Bütünlüğü olmayan birkaç milyon kayıt içeren bir tablo ... yeniden tasarlamak o kadar ucuz değil. Böylece, sütun veya tablo oluştururken doğru tasarımı yapmak maça itfa edilir.

4 - kendi başına veritabanı hakkında çok fazla değil, ama gerçekten can sıkıcı. SQL'in kod kalitesine önem vermemek. SQL'inizin metinde ifade edilmesi, mantığı dize işleme algoritmalarının yığınlarında gizlemeyi TAMAM yapmaz. SQL'i, diğer programcı tarafından okunabilecek şekilde metne yazmak mükemmel bir şekilde mümkündür.


7

Bu daha önce söylendi, ancak: dizinler, dizinler, dizinler . Ben sadece küçük bir profilleme (hangi tabloların çok vurulduğunu görmek için) yaparak ve daha sonra bu tablolara bir dizin ekleyerek düzeltildi kötü performans gösteren kurumsal web uygulamaları birçok durumda gördüm. Bu, SQL yazma bilgisi için bile fazla bir şey gerektirmez ve getirisi çok büyüktür.

Veba gibi veri çoğaltmasından kaçının. Bazı insanlar küçük bir çoğaltmanın zarar görmeyeceğini ve performansı artıracağını savunuyorlar. Hey, DBA'lar bile neler olup bittiğini bilmeyecek kadar soyut olana kadar şemanıza Üçüncü Normal Form'a işkence yapmanız gerektiğini söylemiyorum. Yalnızca bir ad kümesi, posta kodu veya gönderim kodu kopyaladığınızda, kopyaların eninde sonunda birbirleriyle senkronize olmayacağını anlamanız yeterlidir. Olacaktır. Ve sonra haftalık bakım komut dosyasını çalıştırırken kendinizi tekmeliyor olacaksınız.

Ve son olarak: açık, tutarlı, sezgisel bir adlandırma kuralı kullanın. İyi yazılmış bir kod parçasının okunması gerektiği gibi, iyi bir SQL şeması veya sorgusu okunabilir olmalı ve yorum yapmasa bile pratikte ne yaptığını size söylemelidir . Masalarda bakım yapmanız gerektiğinde altı ay içinde kendinize teşekkür edeceksiniz. "SELECT account_number, billing_date FROM national_accounts""ACCNTNBR, NTNLACCTS'DEN BILLDAT SEÇ" seçeneğinden çok daha kolaydır.


Onları doğru bir şekilde ayarlarsanız yapmayacaklar, ancak bu birçok insanın alerjisi olduğu tetikleyicilerin kullanımını içerir.
HLGEM

6

DELETE sorgusunu çalıştırmadan önce (özellikle üretim veritabanlarında) karşılık gelen bir SELECT sorgusu yürütülmüyor!


5

Yirmi yıl içinde gördüğüm en yaygın hata: önceden planlama yapmak değil. Birçok geliştirici bir veritabanı ve tablolar oluşturur ve ardından uygulamaları geliştirirken tabloları sürekli olarak değiştirir ve genişletir. Sonuç genellikle karışıklık ve verimsizdir ve daha sonra temizlenmesi veya basitleştirilmesi zordur.


1
Bu durumlarda ortaya çıkan dehşetleri hayal edebiliyorum ... Şematik veritabanları, hızlı prototip oluşturma ve yinelemeli gelişim için çok daha uygundur, ancak diğer her şey gibi, bu esneklik çeşitli ödünleşmelerle birlikte gelir.
Zsolt Török

4

a) Dize
içindeki kodlama sorgu değerleri b) Veritabanı sorgu kodunu bir Windows Forms uygulamasındaki "OnButtonPress" eylemine ekleme

İkisini de gördüm.


4
"DB sorgu kodunu bir Windows Form uygulamasında" OnButtonPress "eylemine koyma" Burada veritabanı hatası nedir?
özyinelemeli

@recursive: Bu büyük bir SQL enjeksiyon güvenlik açığıdır. Herkes sunucunuza rastgele SQL gönderebilir ve sözlü olarak çalıştırılacaktır.
Bill Karwin

@ Recursive ile aynı fikirde. Bunların gerçekten DB sorunları ile ilgisi yoktur.
p.campbell

b) bir mimari hatadır. Tabii ki, doğrudan uygulamanızda sorguları kodlama kötü bir fikir zaten.
3Dave

4

Uygulamanızdaki veritabanı bağlantılarını yönetmeye yeterince dikkat etmemek. Ardından uygulamayı, bilgisayarı, sunucuyu ve ağın tıkandığını öğrenirsiniz.


4
  1. Bu alanlarda herhangi bir resmi telkin bulunmadığında DBA ve veri modelcisi / tasarımcısı olduklarını düşünmek.

  2. Projelerinin bir DBA gerektirmediğini düşünmek, çünkü bu şeylerin hepsi kolay / önemsizdir.

  3. Veritabanında yapılması gereken iş ile uygulamada yapılması gereken işler arasında doğru bir şekilde ayrım yapmamak.

  4. Yedekleri doğrulamıyor veya yedeklemiyor.

  5. Ham SQL kodlarına gömülüyor.



3

Veritabanlarının eşzamanlılık modelini ve bunun gelişimi nasıl etkilediğini anlamamak. Bundan sonra dizinler eklemek ve sorguları değiştirmek kolaydır. Ancak, etkin noktalar, kaynak çekişmesi ve doğru işlem (doğru okuduğunuzun hala geçerli olduğu varsayılarak!) İçin uygun bir şekilde düşünülmeden tasarlanan uygulamalar, daha sonra düzeltmek için veritabanı ve uygulama katmanında önemli değişiklikler gerektirebilir.


3

Bir DBMS'nin kaputun altında nasıl çalıştığını anlamamak.

Bir debriyajın nasıl çalıştığını anlamadan bir çubuğu düzgün bir şekilde süremezsiniz. Ve sadece sabit diskinizdeki bir dosyaya gerçekten yazdığınızı anlamadan bir Veritabanını nasıl kullanacağınızı anlayamazsınız.

özellikle:

  1. Kümelenmiş Bir Endeksin ne olduğunu biliyor musunuz? Şemanızı tasarlarken bunu düşündünüz mü?

  2. Dizinleri doğru şekilde nasıl kullanacağınızı biliyor musunuz? Bir endeks nasıl yeniden kullanılır? Bir Kaplama Endeksinin ne olduğunu biliyor musunuz?

  3. Harika, dizinleriniz var. Dizininizdeki 1 satır ne kadar büyük? Çok fazla veriniz olduğunda dizin ne kadar büyük olacak? Bu kolayca belleğe sığacak mı? Eğer olmazsa endeks olarak işe yaramaz.

  4. MySQL'de EXPLAIN kullandınız mı? Harika. Şimdi kendinize karşı dürüst olun: Gördüklerinizin yarısını bile anladınız mı? Hayır, muhtemelen söylemedin. Bunu düzeltin.

  5. Sorgu Önbelleğini anlıyor musunuz? Sorguyu erişilemez yapan şeyin ne olduğunu biliyor musunuz?

  6. MyISAM kullanıyor musunuz? Tam metin aramasına ihtiyacınız varsa, MyISAM's zaten saçmalık. Sfenks kullanın. Ardından Inno'ya geçin.


2
Daha iyi bir benzetme biri düzgün olamayacağını olabilir gidermek Bir debriyajı anlamadan bir manuel şanzıman. Birçok kişi, bir debriyajın nasıl çalıştığını bilmeden düzgün bir şekilde vites değiştirir.
Michael Easter

3
  1. Toplu güncellemeler yapmak için ORM kullanma
  2. Gerekenden daha fazla veri seçme. Yine, genellikle bir ORM kullanılırken yapılır
  3. Bir döngüde sqls ateş.
  4. İyi test verisine sahip olmamak ve sadece canlı verilerde performans düşüşünü fark etmek.
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.