2009-07-09 26 views
19

Tôi biết tất cả chi tiết về cách nhóm thực thể làm việc trong kho lưu trữ của GAE, nhưng ngày hôm qua (tại buổi họp App Engine ở Palo Alto), với tư cách là người trình bày đã giải thích việc sử dụng các nhóm thực thể của mình, tôi đã không bao giờ thực sự sử dụng trong số đó trong các ứng dụng GAE của riêng tôi và tôi không nhớ đã thấy chúng được sử dụng trong các ứng dụng GAE nguồn mở mà tôi đã sử dụng. Vì vậy, tôi nghi ngờ tôi đã chỉ nhìn (không chú ý hoặc ghi nhớ) ví dụ như vậy bởi vì tôi chỉ đơn giản là không được sử dụng để họ đủ để ngay lập tức kết nối "sử dụng nhóm thực thể" để "loại vấn đề ứng dụng được giải quyết" - và tôi nghĩ tôi nên khắc phục điều đó bằng cách nghiên cứu các nguồn như vậy với mục tiêu này, tập trung vào vấn đề sử dụng EG đang giải quyết (nghĩa là tại sao ứng dụng hoạt động với nó, nhưng sẽ không hoạt động hoặc không hoạt động tốt nó).Ví dụ nguồn mở tốt về cách sử dụng các nhóm tổ chức trong App Engine?

Ai có thể đề xuất URL tốt cho mã như vậy không? (Các bài tiểu luận cũng sẽ được chào đón, nếu họ tập trung vào giải quyết vấn đề cấp ứng dụng, nhưng không phải nếu, như hầu hết tôi đã thấy, họ chỉ tập trung vào chi tiết về cách thức hoạt động của EG!).

Trả lời

22

Việc sử dụng chính các nhóm tổ chức là cung cấp phương tiện để cập nhật nhiều hơn một thực thể trong một giao dịch.

Nếu bạn không phải sử dụng chúng, hãy đếm các phước lành của bạn. Hoặc bạn đã thiết kế mô hình dữ liệu của mình sao cho không có hai thực thể nào cần được cập nhật cùng một lúc để duy trì tính nhất quán hoặc nếu bạn cần chúng nhưng bạn đã nhận được may mắn :)

Hãy tưởng tượng rằng tôi có một loại thực thể hóa đơn và một loại thực thể LineItem. Một hóa đơn có thể có nhiều LineItems được liên kết với nó. Pháp nhân Hóa đơn của tôi có một trường có tên LastUpdated. Bất cứ khi nào LineItem được thêm vào hóa đơn của tôi, tôi muốn lưu trữ ngày hiện tại trong trường LastUpdated.

chức năng cập nhật của tôi có thể trông như thế này (giả)

invoice.lastUpdated = now() 
lineitem = new lineitem() 

invoice.put() 
lineitem.put() 

gì xảy ra nếu đặt hóa đơn() thành công và đặt chi tiết đơn hàng() không? Ngày lập hóa đơn của tôi sẽ cho thấy rằng một cái gì đó đã được cập nhật, nhưng bản cập nhật thực tế (LineItem mới) sẽ không có ở đó. Giải pháp là đặt cả hai hàm put() vào trong một giao dịch.

Một giải pháp thay thế sẽ là sử dụng truy vấn để tìm ngày của mục hàng được chèn vào cuối cùng, thay vì lưu trữ dữ liệu này trong trường Cập nhật lần cuối. Nhưng điều đó sẽ liên quan đến việc tìm nạp cả Invoice và tất cả các LineItems mỗi lần bạn muốn biết lần cuối cùng một lineitem được thêm vào, khiến bạn tốn kém hạn ngạch kho dữ liệu quý giá.

CHỈNH SỬA ĐỂ TRẢ LỜI KẾT QUẢ CỦA POSTER

Ah. Tôi nghĩ rằng tôi hiểu sự nhầm lẫn của bạn. Các đoạn trên thiết lập lý do tại sao các giao dịch là quan trọng. Nhưng bạn nói rằng bạn vẫn không quan tâm đến các nhóm thực thể, bởi vì bạn không thấy chúng liên quan đến các giao dịch như thế nào. Nhưng nếu bạn đang sử dụng db.run-in-transaction, thì bạn đang sử dụng các nhóm thực thể, có lẽ không nhận ra nó! Mỗi giao dịch liên quan đến một và chỉ một nhóm thực thể và bất kỳ giao dịch cụ thể nào đều chỉ có thể ảnh hưởng đến các thực thể thuộc cùng một nhóm. thấy here

"Tất cả các hoạt động kho dữ liệu trong một giao dịch phải hoạt động trên các đối tượng trong nhóm cùng một thực thể".

Bạn đang làm những việc gì trong giao dịch của mình? Có rất nhiều lý do chính đáng để sử dụng giao dịch chỉ với một Thực thể, theo mặc định là trong Nhóm thực thể của riêng nó.Nhưng đôi khi bạn cần phải giữ 2 hoặc nhiều thực thể đồng bộ, như trong ví dụ trên. Nếu Invoice và các đối tượng LineItem không nằm trong cùng một nhóm thực thể, thì bạn không thể bọc các sửa đổi cho chúng trong một cuộc gọi db.run-in-transaction. Vì vậy, bất cứ lúc nào bạn muốn hoạt động trên 2 hoặc nhiều thực thể giao dịch, trước tiên bạn cần phải chắc chắn rằng họ đang ở trong cùng một nhóm. Hy vọng rằng làm cho nó rõ ràng hơn lý do tại sao chúng rất hữu ích.

+1

Tôi đã sử dụng db.run_in_transaction (xem http://code.google.com/appengine/docs/python/datastore/functions.html) cho các giao dịch (hoặc dĩ nhiên get_or_insert cho trường hợp đặc biệt đó, xem thêm http : //code.google.com/appengine/docs/python/datastore/transactions.html) - lợi thế của các nhóm thực thể là gì? –

+1

ouch! downvote đầu tiên của tôi. lợi thế của các nhóm thực thể đối với các giao dịch là các giao dịch không hoạt động bên ngoài các nhóm thực thể. nếu bạn đã sử dụng giao dịch, thì bạn đã sử dụng các nhóm thực thể, ngay cả khi chỉ ngầm định. mỗi thực thể nằm trong một nhóm theo mặc định. các giao dịch được giới hạn trong phạm vi ảnh hưởng đến một nhóm thực thể tại một thời điểm. tôi đã chỉnh sửa câu trả lời của tôi với một lời giải thích dài hơn. –

+0

Tại sao điều này lại được bình chọn? Đó là một câu trả lời hay. –

2

Tôi đã sử dụng chúng here. Tôi đang đặt đối tượng khách hàng làm phụ huynh của các điểm đánh dấu trên bản đồ. Điều này tạo ra một nhóm thực thể đối với từng khách hàng và mang lại cho tôi hai lợi thế:

  1. Lấy dấu hiệu của một khách hàng được nhanh hơn nhiều, bởi vì chúng được lưu trữ vật lý với các đối tượng khách hàng (Trên cùng một máy chủ, có lẽ trên. cùng một đĩa)

  2. Tôi có thể thay đổi điểm đánh dấu cho khách hàng trong giao dịch. Tôi nghi ngờ các lý do giao dịch yêu cầu tất cả các đối tượng mà họ hoạt động trên cùng một nhóm là bởi vì chúng được lưu trữ trong cùng một vị trí vật lý, giúp dễ dàng thực hiện khóa trên dữ liệu hơn.

1

Tôi đã sử dụng chúng here trong hệ thống wiki đơn giản này. Phiên bản mới nhất của trang luôn là thực thể gốc và các phiên bản trước có phiên bản mới nhất làm tổ tiên. Thao tác sao chép được thực hiện trong một giao dịch để giữ cho phiên bản nhất quán và tránh mất một phiên bản trong trường hợp đồng thời.

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