2010-09-01 29 views
5

google-app-engine ve google datastore'da (bigtable) yeniyim ve gerekli veri modelini tasarlamanın en iyi yolu olabileceğinden şüphelerim var.Hiyerarşik Verilerin Modellenmesi - GAE

Ürün kataloğu gibi bir hiyerarşi modeli oluşturmam gerekiyor, her etki alanının derinlerde bazı alt alanları var. Şu an için ürün yapısı, okuma gereksinimlerinden daha az değişmektedir. Şarap örnek:

  • Kökeni (Toscana, Priorat, Alsacian)
  • Şaraphane
  • Şarap

Tüm ilişkiler ayrÛktÛr (tek Şarapçılık Ait) (sadece bir Menşe Ait) ve eksik.

  • Atalar yönetimi: Ayrıca gereksinimleri sırasına göre muhtemelen farklı potansiyel çözümler oradayız görünüyor belgelerin amacıyla (işlemleri gerektirebilir)

    her şarap için kullanım sayaçlarını saklamak gerekir. Ebeveyn ilişkileri ve işlemleri kullanma

  • Sözde atası yönetimi. Ataları bir db.ListProperty (db.Key)
  • ReferenceProperty ile simüle etme. explicitelly sınıflar

Ama bazen Şarapçılık tarafından kökenlidir bazen çeşitli bazen ... şaraplar almak için beklenen taleplerin sırayla arasındaki ilişkiyi belirtme ... ben sorguları davranışları endişeleniyorum Bu yapıları kullanarak (bir ilişkisel modelde çoklu birleşmeler gibi. Bir ailenin ürünlerini soruyorsanız ... ürün ağacındaki son derin niteleyici için katılmanız ve aileden beri katılmanız gerekir)

Belki bazı yinelenen bilgiler oluşturmak daha iyidir (Google ekibinin önerileri doğrultusunda: işlemler pahalıdır, ancak depolama alanı değildir, bu nedenle yinelenen içerik ana sorun olarak görülmemelidir)

0 Diğer benzer sorulardan

Bazı tepkiler önermek:

  • Mağaza tüm üst kimlikleri bir dizede bir hiyerarşi olarak ... bir yol mülkiyet gibi
  • İçecek varlık arasındaki ilişkileri çoğaltın bir bütün ebeveynler ağaç ...

Herhangi bir öneriniz var mı? İkinci örnekte temsil olarak


Merhaba Will

Bizim vaka daha bir sıkı hiyerarşik bir yaklaşımdır. Ve sorgular ürün listesi almak için, sadece bir tane almak değil.

bir yolu Biz Şarapçılık veya bir Variety gelen Menşe tüm şaraplar, almak gerekir

(sadece bir örnek biz çeşitli sıkı hiyerarşik ağacın başka bir düğüm olduğunu supose ise ise) olabilir Bahsettiğiniz gibi bir yol özelliği şunlardır be:

  • /köken/{id}/şaraphane/{id}/çeşitli/{id}

bana şarap listesini geri kazanmak için izin vermek için Böyle bir sorguyu uygulayan çeşitli:

wines_query = Wine.all() 
wines_query.filter('key_name >','/origin/toscana/winery/latoscana/variety/merlot/') 
wines_query.filter('key_name <','/origin/toscana/winery/latoscana/variety/merlot/zzzzzzzz') 

Ya da Menşe bunun gibi :

wines_query = Wine.all() 
wines_query.filter('key_name >','/origin/toscana/') 
wines_query.filter('key_name <','/origin/toscana/zzzzzz') 

teşekkür ederiz!

+0

Güncelleştirilmiş sorunuzu anlamıyorum. Çeşitlilik hiyerarşiye nasıl sığar? Farklı kökenlerden ve/veya şarap imalathanelerinden gelen şaraplar aynı çeşitliliğe sahip olmaz mıydı? Bu durumda, çeşitliliğin sadece 'Wine' modelinde bir özellik olması gerektiğini düşünüyorum. Ayrıca kendi sorgularımın kendi örnek sorgularımın olmadığını anlamadığını da anlamıyorum. –

cevap

1

Soruda belirtilenlere ek olarak ne tür sorgular yapmanız gerektiğinden emin değilim, ancak açık ata ataletindeki verileri saklamak, sizin istediğiniz soruları kolayca ortaya çıkaracaktır.

Örneğin, belirli bir kökenden tüm şaraplar almak için:

origin_key = db.Key.from_path('Origin', 123) 
wines_query = db.Query(Wine).ancestor(origin_key) 

veya belirli bir şaraphane tüm şaraplar almak için: Eğer çeşitlerinin yanı depolamak varsayarsak

origin_key = db.Key.from_path('Origin', 123) 
winery_key = db.Key.from_path('Winery', 456, parent=origin_key) 
wines_query = db.Query(Wine).ancestor(winery_key) 

ve Şarap modelinde bir özellik, belirli bir çeşitliliğin tüm şarapları kadar basit

wines_query = Wine.all().filter('variety =', 'merlot') 

Açık Bu katı hiyerarşik yaklaşımın olası bir dezavantajı, size empoze edebileceği bir URL şemasıdır. O şarap almak için bir anahtar oluşturmak için bir şarabın menşei ve Can'dan anahtar adı veya kimliği bilmesi gerekir

Origin -> Winery -> Wine 

gibi görünen bir hiyerarşi bulunmaktadır. Zaten bir şarabın anahtarının ipini göstermedikçe. önemli parçasıdır;

  • /origin/{id}/winery/{id}/wine/{id}
  • /wine/{opaque and unfriendly datastore key as a string}

(ilk URL tabii sorgu dizesi parametreleri ile değiştirilebilir: Bu temelde aşağıdaki formlardan birinde şarapların için URL'leri sahip zorlar Belirli bir şarabı tanımlamak için üç farklı bilgi parçasına ihtiyaç duyuyorsunuz.)

Belki de bu URL şemalarımda benim için gerçekleşmemiş başka alternatifler de var.

+0

Teşekkürler, ben cevabınızın sırasına göre soru güncellendi. –