10

Tôi đang xây dựng một ứng dụng trong Google App Engine (Java), nơi người dùng có thể làm cho bài viết và tôi nghĩ trong việc thêm các thẻ để những bài viết, vì vậy tôi sẽ có một cái gì đó như thế này:Kho dữ liệu công cụ ứng dụng: Cách triển khai Bài đăng và Thẻ mà không cần tham gia?

trong thực thể mới gởi:

public List<Key> tags; 

trong thực thể Tag:

public List<Key> posts; 

Nó sẽ được dễ dàng để truy vấn, ví dụ, tất cả các bài viết với từ khóa nhất định, nhưng làm thế nào tôi có thể nhận được tất cả các bài viết mà có một danh sách các thẻ? Tôi có thể thực hiện truy vấn cho mỗi thẻ và sau đó thực hiện một giao lộ kết quả, nhưng có thể có cách tốt hơn ... vì điều đó sẽ chậm với nhiều bài đăng.

Một điều có thể khó khăn hơn là có bài đăng, nhận các bài đăng có thẻ chung được sắp xếp theo số lượng thẻ phổ biến, vì vậy tôi có thể nhận các bài đăng "tương tự" này, theo một cách nào đó.

Vâng, với việc tham gia điều này sẽ dễ dàng hơn nhiều, nhưng tôi bắt đầu với công cụ ứng dụng và thực sự không thể nghĩ ra một cách tốt để thay thế các kết nối.

Cảm ơn!

Trả lời

5

Với thiết kế này, tôi sợ Thẻ thực thể của bạn có thể là nút cổ chai, đặc biệt nếu bạn mong đợi một số thẻ rất phổ biến. Ba vấn đề cụ thể mà tôi có thể nghĩ đến là hiệu quả của việc nhận và đặt của bạn, viết sự tranh chấp và lập chỉ mục bùng nổ. Hãy xem xét stackoverflow cho một ví dụ - có 14.000 bài viết được gắn thẻ "java" ngay bây giờ.

  1. Điều đó có nghĩa là mỗi khi bạn cần tìm nạp đối tượng thẻ java của bạn, bạn sẽ rút lại giá trị dữ liệu khóa 14k từ kho dữ liệu. sau đó bạn đang gửi tất cả trở lại khi bạn làm một đặt. có thể thêm tối đa rất nhiều byte.
  2. Ngoài các byte đi qua lại, mỗi lần đặt sẽ yêu cầu chỉ mục được cập nhật. mỗi mục trong bản đồ ListProperty vào một mục chỉ mục riêng biệt. vì vậy bây giờ bạn đang thực hiện rất nhiều cập nhật chỉ mục. dẫn chúng tôi đến số 3 ...
  3. Chỉ mục bùng nổ. mỗi thực thể có giới hạn về số lượng mục nhập chỉ mục có thể có. Tôi nghĩ giới hạn là 5000 cho mỗi thực thể. vì vậy đó thực sự là một giới hạn khó về số lượng bài đăng có thể có cùng một thẻ.

Đọc thêm:

Tin tốt là, một số yêu cầu của bạn sẽ có thể dễ dàng xử lý bởi chỉ thực thể Post. Ví dụ, bạn có thể dễ dàng tìm thấy tất cả các bài viết mà có tất cả của một danh sách các thẻ với một bộ lọc truy vấn như thế này:

Query q = pm.newQuery(Post.class) 
q.setFilter("tags" == 'Java' && "tags == 'appengine'"); 

Đối với tất cả các bài viết với hoặc java hoặc appengine thẻ, bạn sẽ cần để thực hiện một truy vấn cho mỗi thẻ, sau đó tự kết hợp các kết quả.Kho dữ liệu không xử lý các hoạt động loại OR/IN ngay bây giờ.

Tìm các bài đăng có liên quan nghe có vẻ phức tạp. Tôi sẽ nghĩ về điều đó sau khi uống cà phê.

+1

Tôi không biết rằng khi tôi truy lục một thực thể có thuộc tính danh sách, tất cả các thực thể trong danh sách đó cũng được truy xuất ... Có phải như vậy không? Vì vậy, tôi sẽ xóa danh sách Bài đăng. Tôi cũng không biết rằng tôi có thể truy vấn theo cách đó qua thuộc tính danh sách: q.setFilter ("thẻ" == 'Java' && "thẻ == 'appengine'"); Đó thực sự là tin tốt :) Cảm ơn Peter. – Damian

+0

Các thực thể đầy đủ trong danh sách có thể hoặc có thể không được tìm nạp tùy thuộc vào cách bạn triển khai thực thể của bạn và cho dù bạn đang sử dụng JDO hay JPA (đọc về tìm nạp nhóm trong JDO chẳng hạn) Nhưng ngay cả khi bạn vừa tải khóa, một vài nghìn phím sẽ bắt đầu thêm vào nếu bạn liên tục di chuyển chúng qua lại. –

1

Bạn có thể muốn xem video này từ Google IO. Các thực thể Quan hệ chỉ mục là những gì bạn cần và cho phép bạn xóa List<Key> posts trên thực thể Tag. Cũng như List<Key> tags trên thực thể Post.

1

Xem bài đăng trên blog của @ topchef về điều này: Efficient Keyword Search with Relation Index Entities and Objectify for Google Datastore. Nó nói về việc thực hiện tìm kiếm với các thuộc tính danh sách bằng cách sử dụng Relation Index Entities và Objectify.

+0

đây là câu trả lời cho câu hỏi của tôi, http://stackoverflow.com/questions/5778606/how-do-you-use-list-properties-in-google-app-engine-datastore-in-java – onejigtwojig

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