2010-09-01 49 views
5

Tôi mới trong google-app-engine và google datastore (bigtable) và tôi có một số nghi ngờ theo thứ tự có thể là phương pháp tốt nhất để thiết kế mô hình dữ liệu cần thiết.Mô hình hóa dữ liệu phân cấp - GAE

Tôi cần tạo mô hình phân cấp, giống như danh mục sản phẩm, mỗi miền có một số tên miền phụ sâu. Hiện tại, cấu trúc của sản phẩm thay đổi ít hơn yêu cầu đọc. Rượu dụ:

  • xứ (Toscana, Priorat, Alsacian)
  • Winery (Thuộc duy nhất một xứ)
  • rượu (chỉ thuộc về một Winery)

Tất cả các mối quan hệ là rời nhau và không đầy đủ. Ngoài ra theo thứ tự các yêu cầu có lẽ chúng ta cần phải lưu trữ quầy sử dụng cho tất cả các loại rượu (có thể yêu cầu giao dịch)

Theo thứ tự tài liệu dường như đang có những giải pháp tiềm năng khác nhau:

  • quản lý Tổ tiên. Sử dụng mối quan hệ cha mẹ và giao dịch
  • Quản lý tổ tiên giả. Mô phỏng tổ tiên bằng db.ListProperty (db.Key)
  • ReferenceProperty. Chỉ định rõ ràng mối quan hệ giữa các lớp học

Nhưng theo thứ tự các yêu cầu dự kiến ​​nhận được rượu ... đôi khi theo nhiều loại, đôi khi do nguồn gốc, đôi khi bởi nhà máy rượu ... tôi lo lắng về hành vi của các truy vấn bằng cách sử dụng các cấu trúc này (giống như nhiều kết nối trong một mô hình quan hệ. Nếu bạn yêu cầu các sản phẩm của một gia đình ... bạn cần tham gia vòng loại cuối cùng trong cây sản phẩm và tham gia từ gia đình)

Có thể tốt hơn là tạo một số thông tin trùng lặp (theo thứ tự các đề xuất của nhóm google: các hoạt động tốn kém, nhưng không lưu trữ, vì vậy nội dung trùng lặp sẽ không được xem là vấn đề chính)

Một số câu trả lời của câu hỏi tương tự khác đề nghị:

  • Lưu trữ tất cả các id cha mẹ như một hệ thống phân cấp trong một chuỗi ... như một tài sản đường
  • Duplicate các mối quan hệ giữa các thực thể uống một tất cả các bậc cha mẹ trong cây ...

Bất kỳ đề xuất nào?


Hi Will,

trường hợp của chúng tôi là hơn một cách tiếp cận thứ bậc nghiêm ngặt như bạn đại diện trong ví dụ thứ hai. Và các truy vấn là để truy xuất danh sách các sản phẩm, chỉ truy xuất một danh sách không phải là bình thường.

Chúng ta cần phải lấy tất cả các loại rượu vang từ một xứ, từ một Winery hoặc từ một Variety (Nếu chúng ta giả sử rằng sự đa dạng là một nút của cây thứ bậc nghiêm ngặt, chỉ là ví dụ)

Một cách có thể được bao gồm một tài sản con đường, như bạn đề cập:

  • /gốc/{id}/nhà máy rượu/{id}/nhiều/{id}

để cho phép tôi để lấy một danh sách các loại rượu vang từ một loạt các ứng dụng truy vấn như thế này:

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') 

Hoặc như thế này từ một xứ:

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

Cảm ơn bạn!

+0

Tôi không hiểu câu hỏi được cập nhật của bạn. 'Variety' sẽ phù hợp với cấu trúc phân cấp như thế nào? Rượu vang không phải từ các nguồn gốc khác nhau và/hoặc nhà máy rượu vang có giống nhau không? Nếu là vậy, tôi nghĩ sự đa dạng sẽ chỉ là một tài sản trên mô hình 'Wine'. Tôi cũng không hiểu những gì các truy vấn của bạn đang thực hiện mà các truy vấn ví dụ của riêng tôi thì không. –

Trả lời

1

Tôi không chắc bạn sẽ cần phải làm gì ngoài những câu hỏi được đề cập trong câu hỏi, nhưng việc lưu trữ dữ liệu trong hệ thống phân cấp tổ tiên rõ ràng sẽ khiến những thứ bạn yêu cầu rơi ra khá dễ dàng.

Ví dụ, để có được tất cả các loại rượu vang từ một nguồn gốc cụ thể:

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

hoặc để có được tất cả các loại rượu vang từ một nhà máy rượu vang đặc biệt:

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) 

và, giả sử bạn đang lưu trữ sự đa dạng như một tài sản trên mô hình Rượu, tất cả các loại rượu vang của một giống cụ thể cũng đơn giản như

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

Bật e có thể nhược điểm của phương pháp phân cấp nghiêm ngặt này là loại lược đồ URL mà nó có thể áp đặt lên bạn. Với một hệ thống phân cấp trông giống như

Origin -> Winery -> Wine 

bạn phải biết tên khóa hoặc ID xuất xứ của rượu nhà máy rượu để xây dựng một chìa khóa để lấy rượu đó. Trừ khi bạn đã có chuỗi đại diện cho một chìa khóa của rượu vang. Đây bắt buộc người dùng phải URL cho rượu vang trong một trong các hình thức sau:

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

(URL đầu tiên có thể đương nhiên được thay thế bằng các tham số chuỗi truy vấn; một phần quan trọng là rằng bạn cần ba phần thông tin khác nhau để xác định một loại rượu cụ thể.)

Có thể có các lựa chọn thay thế khác cho các lược đồ URL chưa xảy ra với tôi.

+0

Cảm ơn Will, tôi đã cập nhật câu hỏi theo thứ tự câu trả lời của bạn. –

Các vấn đề liên quan