2009-02-17 17 views
19

Bir uygulamaya 'sürüm oluşturma' yapma ihtiyacım var ve buna en iyi nasıl yaklaşacağımı merak ettim.Hangi sürüm tasarımı desenini önerirsiniz?

Modeli A'nın birçok B

güncelleme üzerine bir ihtiyaç nitelikleri sürüm edilecek ve ilişkili nesneler (B) ayrıca sürüm gereken

:

Bunu genel desene sahiptir. Böylece uygulama, A'nın mevcut sürümünü gösterecektir, ancak A'nın önceki sürümlerini ve ilişkili nesnelerini de görüntülemek mümkün olmalıdır.

Bir belge deposu kullanmak istiyorum, ancak bu uygulamanın yalnızca bir kısmıdır ve bir doc store'a ve bir ilişkisel veri tabanına sahip olmak daha karmaşık hale getirecektir.

Yıldız şemasını kullanmayı düşündüm, ancak ilerlemeden önce, bu sorunla uğraşırken bir tasarım deseni olup olmadığını merak ediyordum?

İlişkilendirilmiş bir nesnenin sürümlerini ilişkisel bir veritabanında depolamanın sorununu çözmek için bu soru, eğiktir. Verileri etkili bir şekilde sorgulayabilmek için gerekli bir ihtiyaç olduğunda (yani serileştirme nesnesi yeterli olmaz).

Güncelleme: ne düşünüyordum/uygulanan ama modeli A çoğaltarak ve tüm ilişkili B ve sürüm niteliğini artırma olacağını "daha iyi bir yolu"

,---------. 1  * ,--------. 
| Model A |----------| Model B| 
`---------'   `--------' 
|PK  |   | a_id | 
|b_version|   |version | 
|version |   `--------' 
`---------' 

olup olmadığını görmek istiyorum var. Ardından b_version ve b.version ile B'ye katılmak için bir seçim yapın. Sadece bu daha iyi yapılabilir eğer merak ediyorum.

cevap

7

Versiyonlama için kendine özgü bir GoF tasarım deseni olmadığını düşünüyorum çünkü birçok uygulama var.

Sürüm oluşturma işleminin en basit uygulaması, bağlantılı bir nesne listesidir. Listedeki her düğüm, versiyonlanabilir nesne ne olursa olsun yeni bir revizyon. Yerden tasarruf etmek için, revizyonlar arasındaki farkın ne olduğunu gösteren diff bir tür uygulayabilirsiniz. Bu şekilde, veri tabanına diffs depolayabileceğiniz gibi, sürüm kontrol sisteminin versiyonları kendi aralarında türetebildiğinden, versiyon versiyonu da kullanılabilir.

esas şuna benzer olabilir veritabanı şeması (en wiki sistemlerde bu deseni görebilir):

+--------------------+ 1  * +-----------------------------+ 
| VersionableObject |---------| Diff      | 
+--------------------+   +-----------------------------+ 
| lastStateContent |   | difference     | 
| originalAuthor  |   | revision     | 
| #dates and whatnot |   | # userId, dates and whatnot |  
+--------------------+   +-----------------------------+ 

Eğer dallanma ve malzeme Eğer bir göz düşünebilirsiniz ile Hardcore gitmek istiyorsanız DAG adresinde, modern dağıtımlı sürüm kontrol sistemlerinin kullandığı sistemdir.

Şimdi, örneğiniz hakkında, yapılandırmalarda kaydedilmesi gereken çok sayıda nesneden bahsedersek. Yani Model için istediğimiz objelerin revizyonlarını seçmeliyiz. Bu bir nevi böyle, (bir ara tabloyla çözüldü) birçok ilişki bir çok var demektir:

+---+ 1 * +---------------+ 1 * +-----------------+ * 1 +-------+ 
| B |-------| Diff   |-------| ModelSelection |-------| Model | 
+---+  +---------------+  +-----------------+  +-------+ 
      | revisionNo |  | {PK} configId | 
      | {FK} configId |  | {FK} modelId | 
      +---------------+  +-----------------+ 

umarım bu yardımcı olur.

+0

Bu uygulama, sürümler ve ilişkili nesneler arasındaki ilişkileri sürdürme sorununu çözmeyecektir – MatthewFord

+1

deimos1986: tabiki bir dbschema örneğiyle güncellenir. Bunu wiki uygulamalarında görebiliyorsunuz. Ben MediaWiki veya diğer opensource wiki sistemleri bakmak ve bazı ilham almak için kendi veritabanı modellerine bir göz atmanızı öneririm – Spoike

+0

Oh Eğer sürümünün sürümleri için gereken tüm nesnelerin bir konfigürasyonu var demek istiyorsun ... – Spoike

1

Memento pattern'un Observer pattern ile birleşimi, gereksinimlerinize uygun olmalıdır. Sizin durumunuzda olası uygulama için Visitor pattern'a da bir göz atın ...

+0

Sorunun, DB düzeyinde tasarımla ilgili olduğunu tahmin etmemde yardımcı olabilir gibi görünüyor. Memento'yu, aynı zamanda kalıcı olması gereken birden fazla ilişkili nesneye sahip olduklarında nasıl ısrar etmeyi düşünüyorsunuz? – MatthewFord

+0

Her nesne, durumunu ilgili veritabanı tablosuna depolamaktan sorumludur. Her nesne aynı zamanda her sürümde Gözlemci üzerinden senkronize edilen bir "versiyon" özniteliğine sahip olduğunda, tutarlı ve tekrarlanabilir bir durumun depolanması mümkün olmalıdır. – Kosi2801

2

Bu sorunu, acts_as_versioned eklentisini kullanarak raylarda çözdüm. Bir modele uyguladığınızda, model_name tablosuna ek olarak model_name_version olduğunu varsayar. Bir model her kaydedildiğinde, eski sürüm bir zaman damgasıyla birlikte model_name_version tablosuna kopyalanır.

Bu yaklaşım, daha önceki sürümlerde arama yapmaya izin verirken, model tablosunun boyutunu yönetilebilir tutar. Eklentinin kutudan istediğiniz zincirlemeyi ele geçirdiğinden emin değilim, ancak eklemek zor olmaz.

veritabanı Shema bir XML anlık kaydetme hakkında sürümüne istedikleriniz

http://martinfowler.com/eaaDev/timeNarrative.html

+0

acts_as_versioned ve diğer mevcut eklentilere bir göz attım, hiçbiri sürüm dernekleri sürümüyle ilgilenmiyor. AAV wiki sayfası şu açık soruyu sormaktadır: Yabancı anahtar ilişkilerini yorumlamakla herhangi bir iş yapmış olan var mı? – MatthewFord

+0

Doğru - Beklemediğini umuyorum. Bununla birlikte, eklentiler değiştirmek için son derece kolaydır ve bu özel değişiklik zor olmaz. –

+0

Sorguda açıklanan hatlar boyunca bunu uygulayan Sequel için bir eklenti yazdım. AR'de tekrar bıçaklamak ve mümkün olan en iyi yolu yapmak isterim. AAV eklenti koduna bir göz atın, n..n derneklerini işlemek için genişletmek önemsizdir. – MatthewFord

8

Martin Fowler zaman/sürüm tabanlı tasarım desenleri üzerinde bazı iyi makaleleri vardır? Ve sonra veritabanının durumunu değiştirmek mümkün olabilir mi?

+0

için zamanım olmadığı bazı TLC'ye ihtiyaç duyuyoruz. Bu bağlantı, bir versiyon numarası kullanmayı önerdiğim bir boyut olarak zaman kullandığından, fikirlerimi doğrulamak için iyi oldu. – MatthewFord

0

: kesinlikle değer bir göz -

+0

dürüst bir şekilde geri dönüp baktığım zaman, ihtiyacım olan tüm verileri alıp büyük bir json dokümanıyla birleştirerek ve bir versiyona (tablolardan oluşan bir koleksiyon) ihtiyaç duyduğumda onu couchdb'ye dökerek sorunu çözdüm. Sorunlar şema ile değil, çoklu tabloları kapsayan çok fazla değil. – MatthewFord

İlgili konular