2010-10-08 21 views
5

Không thể truy vấn kho dữ liệu App Engine để có kết quả tổng hợp.Chiến lược thay thế để tập hợp truy vấn ("nhóm theo") trong kho dữ liệu công cụ ứng dụng google

Ví dụ: Tôi có một thực thể gọi là "bài" với các lĩnh vực sau:

id chính, String nickname, String postText, int điểm

Tôi có nhiều nickname khác nhau và nhiều bài viết mỗi nickname trong kho dữ liệu của tôi.

Nếu tôi muốn có một ban lãnh đạo của mười nickname trên cùng của tổng điểm số, tôi sẽ thường có sql như sau:

select nickname, sum(score) as sumscore 
from Post 
group by nickname 
order by sumscore 
limit 10 

Đây là loại truy vấn là không thể trong google công cụ ứng dụng kho dữ liệu java api (JDO hoặc jpa).

Chiến lược thay thế nào tôi có thể sử dụng để đạt được kết quả tương tự?

Thận trọng và dứt khoát, tôi có thể tải mọi thực thể Đăng và tính toán tập hợp đầy đủ trong mã ứng dụng của mình. Điều này rõ ràng là không hiệu quả trên các tập dữ liệu lớn.

Tôi có thể sử dụng các chiến lược nào khác?

+1

Nếu Google chỉ cập nhật Plugin DataNucleus của họ sẽ thực hiện cách tiếp cận "thô và bạo lực" đó cho bạn một cách minh bạch. Các mã để làm điều đó sẽ chỉ là một số ít các dòng để plugin của họ, đóng góp một năm trước đây ... – DataNucleus

+1

@DataNucleus Có được xây dựng trong hỗ trợ sẽ không làm cho nó bất kỳ nhanh hơn hoặc hiệu quả hơn. –

+1

@Nick, tất nhiên là không, nhưng toàn bộ trải nghiệm người dùng sẽ là một cảnh chết tiệt dễ chịu hơn và số lượng người viết mã phải viết ít hơn - đó là doanh nghiệp chúng tôi đang ở – DataNucleus

Trả lời

10

Tạo mô hình Nickname và mỗi lần bạn thêm Bài đăng mới, truy xuất Biệt hiệu tương ứng và tăng tổng số điểm được lưu trữ ở đó. Về cơ bản, thực hiện tính toán tại thời gian chèn/cập nhật, không phải thời gian truy vấn.

+0

Xin chào Amber.Cảm ơn sự đóng góp của bạn. Tôi đã làm điều này ở một mức độ nào đó. (Mô hình của tôi phức tạp hơn tôi mô tả nó). Tôi đã tổng hợp rất nhiều dữ liệu về chèn và cập nhật để thực hiện việc này. Nhưng nó không phải là khả thi để tiết kiệm tất cả các số liệu thống kê tổng hợp có thể theo cách này (tôi có rất nhiều số liệu thống kê tổng hợp khác nhau mà tôi muốn tính toán tất cả bây giờ và sau đó). Nhưng đây vẫn là một câu trả lời hợp lệ. – Patrick

+1

Cách tiếp cận của Amber là đúng, và nó sẽ mở rộng. Tôi sử dụng một cách tiếp cận rất giống với 'người hâm mộ với quan điểm vật chất' (http://code.google.com/events/io/2010/sessions/high-throughput-data-pipelines-appengine.html) để tính toán hàng tá tổng hợp. Nó hoạt động khá tốt. –

+1

Tôi đang sử dụng kỹ thuật này, cùng với sharding để giảm thiểu tranh chấp (http://code.google.com/appengine/articles/sharding_counters.html); cũng như có thể trì hoãn nguyên bản các cập nhật của các quầy và thống kê đó. Tôi đánh dấu câu trả lời này là câu trả lời hay nhất. – Patrick