2010-07-25 41 views
5

Tôi cố gắng để thiết kế một mô hình dữ liệu mà có thể tổ chức một số lượng rất lớn dữ liệu, không ai có kinh nghiệm trong khối lượng lớn dữ liệu có bất kỳ thông tin phản hồi về vấn đề này, ví dụ:Giao dịch trên nhóm đối tượng rất rất lớn

// example only, not meant to compile 
public class TransactionAccount { 
    private long balance; 
    private List<Transaction> transactions = new ArrayList<Transaction>(); 
    .... 
    public long getBalance() { return balance; } 
} 
private class Transaction { 
    public Date date; 
    public long amount; 
} 

Dựa trên những gì tôi đã đọc, cách duy nhất để có được tính toàn vẹn giao dịch khi chèn Transaction và cập nhật balance là biến nó thành một nhóm thực thể.

Tuy nhiên theo thời gian sẽ có hàng triệu giao dịch cho một số TransactionAccount cụ thể. Số lượng ghi cho nhóm thực thể này sẽ thấp, nhưng số lần đọc sẽ cao hơn nhiều.

Tôi biết nó có thể bị hỏng, tuy nhiên việc đọc balance là một hoạt động rất thường xuyên, và sharding nó sẽ làm cho một trong những hoạt động phổ biến nhất getBalance() hoạt động chậm nhất.

+0

Có [câu hỏi tiếp theo] (http://stackoverflow.com/questions/3342603/how-do-you-propery-add-manipulate-thousands-of-children-in-an-entity-group) thảo luận [cách quản lý] (http://stackoverflow.com/questions/3342603/how-do-you-propery-add-manipulate-thousands-of-children-in-an-entity-group) một nhóm thực thể với hàng chục của hàng ngàn đối tượng trẻ em. – Jacob

Trả lời

3

Cách sắp xếp bạn mô tả sẽ hoạt động tốt. Nếu nhóm thực thể của bạn phát triển quá lớn (chúng tôi đang nói hàng trăm megabyte giao dịch trước khi điều này trở thành vấn đề), bạn có thể viết thủ tục 'cuộn lên' các giao dịch cũ: thay thế giao dịch một tập hợp các bản ghi giao dịch cũ tổng các giao dịch đó, để duy trì bất biến là số dư bằng tổng của tất cả các giao dịch. Nếu bạn vẫn cần phải lưu trữ một bản ghi của các giao dịch cũ, 'cuộn lên' này, bạn có thể tạo một bản sao của chúng trong một nhóm thực thể riêng biệt trước khi bạn thực hiện cuộn lên.

+1

Đây là một ý tưởng tuyệt vời, bạn có thể có một tác vụ "cron" để kiểm tra các thực thể có nhiều hơn X bản ghi và sau đó chỉ cần di chuyển, các giao dịch X cũ nhất đến một nhóm thực thể khác. – corydoras

+0

Chỉ tò mò thôi, bạn lấy con số "hàng trăm megabyte" làm hướng dẫn ở đâu? Nó sẽ không được một chút quá nhiều để có một "giao dịch" đối tượng được nạp vào bộ nhớ có chứa 100Mb dữ liệu? – corydoras

+1

Bởi hàng trăm megabyte, tôi có nghĩa là kích thước của nhóm thực thể nói chung - tài khoản và tất cả các giao dịch của nó - không phải là kích thước của một thực thể duy nhất. Tôi nhận được hàng trăm megabyte hướng dẫn từ kinh nghiệm của riêng tôi với tư cách là quản trị viên Bigtable. :) –

2

Bạn chính xác rằng TransactionTransactionAccount phải thuộc cùng một nhóm tổ chức để thực hiện thao tác chèn và cập nhật giao dịch.

Lý do để phân đoạn là giảm bớt tranh chấp viết nhưng bạn nói đây sẽ là một thực thể viết thấp, vì vậy không cần phải sử dụng ở đây.

Để giữ kích thước nhóm thực thể của bạn không hoạt động, bạn có thể thiết bị một số loại quy trình lưu trữ. Ví dụ: nếu đây là tài khoản ngân hàng thì khi phát biểu hàng tháng được tạo, bạn có thể lưu trữ giá trị giao dịch của tháng đó.

+1

Điều này là gần, tuy nhiên ranh giới một tháng có thể không phải là cách tốt nhất để làm điều đó .. như trong các giai đoạn cao điểm rất nhiều có thể xảy ra trong một tháng. – corydoras

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