Tüm DB tablolarında oluşturulan tarih ve son güncellenen tarih alanı dahil olmak üzere standardizasyon yapmak mantıklı mı?


37

Patronum şu anda ekibimize bazı geliştirme standartları uygulamaya çalışıyor, bu yüzden dün, çoğunlukla ortaya çıkana kadar iyi giden standartları tartışmak için bir toplantı yaptık.

  • Tüm DB tabloları, tetikleyiciler tarafından güncellenen bir CreatedDate ve LastUpdatedDate sütununa sahip olacaktır.

Bu noktada ekibimiz bir fikir şeması yaşadı; bir yanımız bunu tüm masalarda yapmanın çok az fayda sağlayan büyük bir iş olduğunu düşünüyoruz (sabit bütçeli projeler üzerinde çalışıyoruz, bu yüzden herhangi bir maliyet şirketimizin karından geliyor); ikinci yarı, projelerin desteğiyle yardımcı olacağına inanıyor.

Sıkıca eski kamptayım. Bazı dış durumların ekstra sütunların desteklenebilirliği arttırmasına neden olacağını takdir ederken, bence sütunları ilk etapta eklemek için gerekli olan çalışmaların yanı sıra bakım da daha az zaman harcamamıza neden olacaktır. Birim veya Yük Testi gibi önemli şeyler. Ayrıca, bu fazladan sütunların, başlangıçta çok mutlu olmadıkları için C # ve Oracle kullandığımızı akılda tutarak bir ORM kullanmayı daha da zorlaştıracağından oldukça eminim.

Yani benim sorum iki yönlü:

  • Doğru kampta mıyım? Dünyaca ünlü veritabanı becerilerine sahip olduğumu iddia etmiyorum, bu yüzden olumsuz yan etkileri olmadan çok kolay bir ek olabilir.
  • Standartlarla ilgili bir toplantının cüretkar bir eşleşmeye dönüştüğü bir durumla nasıl başa çıkacaksınız? Bu standardın uzun vadede bize yardımcı olmayacağını nasıl satabilirim?

Neden C # ORM-mutlu olmadığını söylüyorsun? Ayrıca, örneğin, NHibernate'deki bu iki sütunun eşleştirilmesine [insert = "false" update = "false" created = "always"] özelliklerini eklemek örneğin bana garip gelmiyor mu, yoksa bir şey eksik mi?
Jalayn

C # + Oracle ORM’den memnun değil ve NHibernate’in çok ağır olduğunu gördük (görünüşe göre, bu tip bir takım araştırmasına dahil değildim). Muhtemelen C # ve Oracle'ı ana soruya geri döndürdüm.
Ed James

Veritabanı standartlarına daha açıklayıcı olması için sorunuzun başlığını yeniden adlandırmayı düşünmelisiniz.
maple_shaft

Bu nasıl bir şeyden uzaklaşır? 'Dış durumlar' için en az iki kez yapmanız gerekecek. Bir araç ve yeniden kullanılabilir sınıflar oluşturun ve bir daha asla endişelenmeyin.
Steven Evers,

Yanıtlar:


27

Bu oldukça yaygın bir uygulamadır, ancak desteklenebilirliğin temel fayda olduğunu söylemem. Bu yaklaşımın asıl yararı denetim izi tutmaktır. Son güncellemeyi yapan kullanıcının kullanıcı adını içeren fazladan bir sütuna sahip olmak da yaygındır.

Herhangi bir finansal veya hassas veriyle uğraşıyorsanız, PCI ve SOX uyumluluğu gibi şeyleri duyduğuma eminim . Bu şartnamelerin yerine getirilmesinde kapsamlı bir denetim izi bulunması şarttır.

Feragatname: Bununla birlikte, bir veritabanı denetim izi elde etmenin çok daha iyi yolları vardır> https://stackoverflow.com/questions/1051449/ideas-on-database-design-for-capturing-audit-trails


Üzgünüz, bahsetmeyi unuttum, PCI (vb.) Uygunluğu uygulanamaz, kayıt defterlerinde zaten süreç denetim izi vardır (HER ŞEY oldukça ayrıntılı bir şekilde kaydedilir).
Ed James,

6
“(HER ŞEY tamamen ayrıntılı bir şekilde günlüğe kaydedilir)” , CreatedDate ve LastUpdatedDate içeriyor mu? Öyleyse, meslektaşlarınızı DRY ilkesine doğru yönlendirebilirsiniz :)
MattDavey

2
Bu çok iyi bir nokta, belki de arşivlenmiş verileri kolayca sorgulamak için kullanabileceğimiz daha verimli bir günlük ayrıştırıcısı için zorlamalıyım (açıkçası veriler denetim takibi amaçlıdır, bu nedenle bir haftadan daha fazla bir süre saklamayız.) sorgu, gerisi depolanır).
Ed James,

3
Bu yaklaşım verecektir sanmıyorum zengin denetim izi ... Hatta bir demezdim denetim izi hiç.
Jordão

@ Jordão Ortak bir yaklaşım olduğunu söyledim, bunun iyi olduğunu söylemedim! Dolayısıyla feragatname :)
MattDavey

16

Eski argüman geçersiz, çünkü bir dizi tabloya tutulan birkaç veritabanı zaman damgası alanı eklemek zor bir iş değil. Aslında bu, bir küçük ya da stajyerin yapacağı zihin uyuşmazlığı görevidir ve boş zamanlarını ayırarak tek bir iki haftalık sprintte kolayca yapabilirlerdi.

ORM'nizde bu alanları eşleştirmek gerekebilir veya olmayabilir, çünkü uygulama kullanıcılarının bu alanları değiştirmesini istemezsiniz ve bakım ve hata ayıklama için kullanışlıdırlar ve nadiren iş mantığında kullanımları vardır. Her ikisini de yapan dükkanlarda çalıştım ve açıkçası bu konuda da pek bir fikrim yok.

Veri tabanı düzeyinde bu tür bir işlevselliğin uygulanmasındaki insan maliyetinden çok daha ağır basılmış olsa bile, faydalar, muhtemelen projelerin toplu beyin gücünden daha azdır ve toplantıyı ele geçiren büyük teknik beyinler ve epik bir sandık atma maçında dağıtırlar. Birkaç saatlik 1 saatlik toplantıların bir projenin ömrü üzerindeki etkisini tam olarak ortaya çıkardığınızda, muhtemelen pahalı olmalarına şaşırmayacaksınız. Bütün bu insanların saatlik ücretlerini ve faydalarını bir araya getirdiğini ve bunun size bir fikir vermesi gerektiğini hayal edin.


8
Tetikleyicilerle birlikte yoksa, bu tabloları her tabloya ekleyen bir komut dosyası oluşturun.
JeffO

3
+1 Kodları birkaç gün içinde kolayca oluşturabilirsiniz. Manuel olarak yapılırsa sadece çok iş.
Jon Raynor

8

... bir erkek ne kadar kesin ifade verirse kesin olarak yanlış olması muhtemeldir ... - tyler durden

Bu, battaniye "standartları" için de geçerlidir, ancak bazı masalarda bu büyük bir kazanç olabilir, her masada büyük olasılıkla işe yaramaz bir gürültü ve sürdürmek veya korumak için daha fazla kod olurdu.

Burada sahip olunacak bir denge var, karar vericilere itmeniz gereken şey bu.


8

Gönülden katılıyorum. Neredeyse her veritabanındaki her tabloda en az 2 alan olmalıdır: oluşturma tarihi ve güncelleme tarihi . Oluşturma tarihi ve güncelleme tarihi belirlemenizin birçok nedeni vardır. Daha önce belirttiğimiz kişilerin açıkça ifade ettiği nedenlerden dolayı… ki denetimdir.

25 yıldır sistemler ve veritabanları tasarlıyorum ve yüzlerce müşteri için çalıştım. Buna ihtiyaç duymayan tek bir müşteri yok.

Bunu yapmanın 2 temel yolu vardır:

1 - İlk uygulama, veritabanının işi yapmasına ve doğrudan masa tasarımına koymasına izin vermektir. Çıplak minimum olanı tavsiye ederim.

2 - Tercih ettiğim diğer uygulama .... bununla baş etmek için bir çoğaltma aracı kullanıyor. DEV ekiplerinin masrafları az ve masrafı yok. Ancak araçlar pahalıdır. Ek bir avantaj, silme işleminin bu tür bir araçla çok daha kolay denetlenebilmesidir. Bir çoğaltma aracı olmadan bir denetim masası oluşturmanız ve silmeler için yangın tetikleyicileri oluşturmanız gerekir - bence iyi bir uygulama değil.

Bu alanlara sahip olmanın bir başka yararı da, herhangi bir OLTP sistemi için üretilmiş HER ZAMAN veri ambarı ve ODS'dir. Artımlı verileri onsuz etkili bir şekilde çekemezsiniz. Aksi takdirde, her gün DB'nin tamamını yeniden yükleme riskiniz olur.

Bu 2 tarihi koymak için buraya girmeyeceğim çok sayıda başka ticari neden var. Ödevini yap ve yolun aşağısındaki 3-6-12-48 ay boyunca bu 2 basit alana koyduğun için çok mutlu olacaksın.

Mümkünse her iki çözümü de uyguladım ve önerdim.


5

Oluşturulan tarihi ve veritabanımızdaki sütunlarla oluşturduğumuz ve veri sorunlarını takip etmemizde bize çok yardımcı oldular. Geri dönmemiz gerekirse, tüm denetim tablolarında doğru kayıtları bulmamıza yardımcı olur (çünkü çok büyük bir tabloda nereye bakacağımızı biliyoruz). O tarafından bir de eklenmeli ve sütunlarla değiştirilmelidir. Gerçekten de, eğer tam denetime sahip değilseniz, verileri kimin verdiğini bilmek gerçekten yardımcı olur.

Bir şekilde denetlenmesi gerekmeyen herhangi bir Kurumsal uygulama düşünemiyorum. Görünüşe göre patronun sadece nispeten hafif denetime ihtiyacı olduğunu düşünüyor. Şahsen, şirketinizin bağlı olduğu verileri içeren her veritabanında tam denetim yapılmasını tercih ederim (bu 2000 hatalı kaydı denetim masasından geri almak, yedekleri geri yüklemek yerine kullanmaktan çok daha kolaydır) Bu tür şeyler gördük, dolandırıcılık işleyen insanları yakalamaya yardımcı oldum. Tüm denetim veritabanı seviyesinde olmalıdır.

Bu veriler nasıl yardımcı olabilir? İlk önce eski verileri ne zaman arayacağınızı daraltır (bir revizyonda) ve veriler girildiği sırada programınızın hangi sürümünün aktif olduğunu görmenize yardımcı olabilir. Yani, 6 Temmuz 2011'de yayına girmiş olan 2.3 sürümünde bu sorunu çözdüğünüzü ve sonra da 7 Ağustos'ta eklenmiş bir kayıtla aynı sorunu bulduğunuzu biliyorsanız, belki düzeltmeniz iyi değildi. Eski verilere geri dönmeniz gerekirse, tam denetime sahip değilseniz, eski verileri hangi sürümlerinde bulabileceğinizi size söyleyecektir.

Geliştiriciler nadiren verilerin zaman içinde saklanması gerektiğini ve kötü verilerin birileri tarafından düzeltilmesi gerektiğini düşünmektedir. Böyle şeylere sahip olmak, böyle şeyler yapmak zorunda olanlarımız için çok değerli olabilir. Patronun haklı, ancak denetim konusunda yeterince ileri gittiğini sanmıyorum. Bu sütunların ve tetikleyicilerin eklenmesi için gereken çok az süreyi haklı çıkarmak için düzeltmesi kolay, gerçekten ciddi bir problemi alır.


İnsanları etkili bir şekilde görmeyi tercih ederim Ünite Düzeltmelerini test etmek, bunları DB kontrolleriyle doğrulamaya çalışmak yerine, ancak amacınızı takdir ediyorum. Ancak, emin değilim yapmak nokta, tüm veritabanlarında HER tabloya vb hatta referans tabloları geçerli olacağı yönündeki
Ed James

Birim testleri denetimden ayrıdır. Bir hatayı yakalayabileceğinden bahsettim, çünkü test edilmemiş bir kenar durumu olduğundan ünite testleri yapıldığında bile olduğunu gördüm. Ayrıca, hata düzeltmeden önce verilerin girildiğine işaret edebilir ve daha sonra düzeltilmesi gereken diğer verileri bulmanız gerekebilir. Ya da sadece 6 Haziran 2016'da yapılan bir içe aktarma işleminde girilen verilerin, sorunun ithalatınızın yaptığınız bir işlem olup olmadığını veya içe aktarma dosyasındaki verilerle ilgili yanlış bir şey olup olmadığını görmenize yardımcı olduğunu bilmenizi sağlar. Yıllarca süren günlük ithalat dosyalarına bakmaktan çok daha kolay.
HLGEM

4

İş yükü oldukça fazladır, çünkü bu kod yazılabilir ve oluşturduğunuz her veritabanına uygulanabilir. Tetikleyicilerle birlikte tüm tablolara sütunları ekleyin. Sadece yapınızla çalıştırmayı hatırlamanız gerekiyor.

Müşterinin istediği kadarıyla, uygulamanıza uygun gördükleri şekilde entegre etmek için size ödeme yapmalarını sağlayabilirsiniz. Birçoğu, en son ve ne zaman kayıt yaptıran / değiştiren bir kayıt hakkında ek bilgi görmeyi sever. Öğrenmek ya da yalan söylemek için herkese bir e-posta göndermenize gerek yok. Birisi bir kayda her baktığında bir günlük sorgulamak zorunda kalmazsınız.

Veritabanına koymak ve sadece olması durumunda orada bulundurmak zor değildir ve alanları kullanan ek özellikler için ücret almanıza veya sistemi ne kadar müşterinin kullandığı konusunda size biraz geri bildirim vermenize izin verebilir.


Müşteriler konuyla ilgili herhangi bir görüş belirtmemişlerdir (bildiğim kadarıyla) ve muhtemelen yeni standartlarımız hakkında hiçbir fikrim yok, bu yüzden herhangi bir entegrasyon için para ödemekten hoşlanmadıklarını umuyorum;) Ancak, "şarj etmenize izin verebilir" olayı, gelişim için her zamanki yaklaşımım için "olabilir" e biraz güveniyorsa, oldukça iyi bir argümandır.
Ed James

1

Bu, uygulanması oldukça önemli (belki de toplam 1 ila 3 gün), bu yüzden bence kullanım ömrü boyunca uygulamanıza ne kadar katkısı olacağını düşünüyorum.

Öncelikle, sütunlar eklemek için bir alter table ifadesi gerekecekti, alter tablosu hepsi aynı olacaktı (tablo adı hariç), böylece gerekli olan tüm tablolar için alter SQL deyimini oluşturacak kod yazacaksınız. . NULL'ların mevcut verileri hesaba katmasına ve yeniden çalıştırılabilir olması için sütunların varlığını kontrol etmesine izin vermek zorundasınız.

İkincisi, sütunlar için GetUTCDate () (SQL Server, Oracle belki farklı) gibi varsayılan değerleri kullanmak, ekleme sırasında kodlama eklemelerini çözer; bu nedenle, varsayılan değerlerin Kullanılmış.

Veri güncellemeleri (en son değiştirilen değişiklik) bir güncelleme tetikleyicisi ile çözülebilir. Yine, bu tetikleyici tüm tablolarda neredeyse aynı olacaktır, bu nedenle bu tetikleyici kodu (SQL) mevcut tüm tablolar için de üretilen kod olabilir.

Potansiyel olarak çok sayıda sql betiği kodu olurdu (kaç tane tablonun olduğuna bağlı olarak), fakat tekrarlanabilir bir kalıp olabilir, böylece mevcut bir DB şemasına bakarak onu oluşturabilirsiniz.


Bunun gibi büyük bir grup yaklaşımıyla, yeni tablolarla uzun vadeli bakım sorunlarınız olacağı ya da (daha da kötüsü) her tabloyu belirli sütunlar için tarayan bir sproc oluşturmak zorunda kalacağınızdan endişe ediyorum. DDL betiği eksikse onları ekler, ki bu da bir bakım kabusu gibi geliyor!
Ed James

Bu bir standartsa, umarım yeni tabloları hazırlayan geliştirici standardı takip eder. Aksi takdirde, evet, kabus. Buradaki yaklaşım mevcut şemanın hızlanmasını sağlamak, onus'un standartlara uyması için geliştiricinin kullanımından sonra.
Jon Raynor

Bence bu yorumdaki anahtar kelime "umarım" dır, her geliştiricinin kendi iradesiyle gerçekleşecek herhangi bir şeye güvendiğimden emin değilim!
Ed James

2
@Ed - Anlaştık, güvenmedik, kod incelemelerinin anlamı bu! :)
Jon Raynor
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.