2013-08-27 40 views
5

Tình huống: Tôi có cơ sở dữ liệu và ứng dụng web tương tác để hiển thị và cập nhật bảng dữ liệu khoa học. Nhiệm vụ của tôi là xây dựng một ứng dụng di động mà sẽ cho phép người dùngXác thực/đồng bộ hóa cơ sở dữ liệu trực tuyến/trực tuyến từ jQuery Mobile

  1. Authenticate và tự nhận mình offline để theo dõi Mục đích (sử dụng được xác định trước nhưng năng động với người sử dụng tài khoản và cho phép lưu trữ trong bộ nhớ cache)
  2. Tải dữ liệu nhận dạng cho Làm việc trong lĩnh vực (có internet)
  3. Make và cửa hàng Quan sát trong lĩnh vực (không có internet)
  4. Đồng bộ quan sát vào một cơ sở dữ liệu trực tuyến tại một thời gian sau đó

Câu hỏi: Cách tốt nhất để đi xác thực/tải xuống/lưu trữ/tải lên dữ liệu cần thiết để quản lý ứng dụng như vậy độc lập với truy cập internet nhất quán là gì? Nếu hai người điều chỉnh cùng một lần đọc và một cập nhật xảy ra ở giữa các đồng bộ, làm cách nào để theo dõi bảng và giá trị nào đã bị thay đổi và ngăn các thay đổi bị mất?

Đào tạo hiện tại của tư tưởng: Chiến lược dự phòng hiện tại của tôi về kiểm soát va chạm để duy trì bảng "Đồng bộ hóa" lưu trữ các đối tượng JSON đại diện cho mọi giao dịch cơ sở dữ liệu trực tuyến được lưu trữ trong sessionStorage và ứng dụng liên tục xác minh đồng bộ hóa trước khi tải lên dữ liệu và kiểm tra đối tượng này đối với các xung đột tiềm năng khi cập nhật các khóa chính cụ thể. Tôi muốn có thể khóa tuples khi họ đang ở trong một giai đoạn chỉnh sửa, nhưng điều đó dường như không thể với truy cập internet không phù hợp.

Xin lỗi nếu điều này là một chút của một câu hỏi newb, Tôi mới đến toàn bộ điều phát triển ứng dụng di động ...

tl; dr Làm thế nào để ngăn chặn những thay đổi không đồng bộ cơ sở dữ liệu từ các ứng dụng di động đi vào và ngoại tuyến khi ghi đè/va chạm với những thay đổi của một cá nhân khác đối với cùng một cơ sở dữ liệu? Và làm cách nào để tôi xác thực người dùng bằng kết nối mạng?

+0

Đồng thời là một vấn đề với nhiều ứng dụng và dữ liệu. Chỉ có một khoảng cách dài hơn trong việc đăng tải và công nghệ với thiết bị di động, nhưng nó không khác biệt. – JeffO

+1

@ JeffO bạn không thực sự trả lời câu hỏi của tôi .. đồng thời và xung đột dữ liệu là một vấn đề tôi đã xác định, đó là sự thật, nhưng những gì của nó? – XaxD

Trả lời

2

Như để đồng bộ hóa, bạn có thể có một cái nhìn tại jIO - một mở -thư viện nguồn chúng tôi đang làm việc trên đó có thể đồng bộ hóa tài liệu JSON trên các loại kho khác nhau và có API siêu đơn giản.

Có một loạt các trình kết nối có sẵn và đang được thực hiện (webDav, S3, xwiki, v.v.) và bạn cũng có thể viết trình kết nối của riêng bạn để kết nối JIO với bất cứ nơi nào bạn đang cung cấp dữ liệu JSON của mình.

Sau đó trên máy khách, bạn có thể ví dụ như thiết lập một kho lặp-sửa đổi bằng cách sử dụng localhost khách hàng và lưu trữ từ xa như kho:

var jio_instance = jIO.newJio({ 
    "type": "replicaterevision", 
    "storage_list": [{ 
    "type": "revision", 
    "sub_storage": {<storage spec for your localhost storage>} 
    }, { 
    "type": "revision", 
    "sub_storage": {<storage spec for your remote storage>} 
    }] 
}); 

Tất cả các kho trong storage_list sẽ tự động được phiên bản và đồng bộ. Vì vậy, nếu người dùng ngoại tuyến, truy xuất tài liệu, chỉnh sửa và lưu nó (chỉ với localstorage, khi người dùng đang ngoại tuyến), jIO sẽ ném xung đột vào lần tiếp theo người dùng cố truy cập tệp khi trực tuyến, bởi vì phiên bản hiện tại remote-storagelocalstorage khác nhau.

Sau đó, nó chỉ là vấn đề viết thường trình để giải quyết bất kỳ xung đột nào phát sinh từ nhiều người dùng chỉnh sửa tài liệu khi trực tuyến/ngoại tuyến = phiên bản nào cần giữ/hợp nhất/v.v.

Truy cập vào tài liệu khá đơn giản. tài liệu JSON có dữ liệu meta và tệp đính kèm và bạn có thể sử dụng các lệnh sau đây để sửa đổi tài liệu JSON của bạn:

POST > generate a new document 
    PUT > update existing document 
    GET > retrieve a document 
    REMOVE > delete a document 
    ALLDOCS > retrieve all documents 
    PUTATTACHEMENT > add an attachment to a document 
    GETATTACHEMENT > retrieve an attachment from a document 
    REMOVEATTACHEMENT > delete an attachement from a document 

callable như thế này:

jio_instance.get({"_id":"your_doc_id"}, function (err, response) { 
    // do something 
    }); 

Jio cũng có một mô-đun complex-queries, cho phép để chạy cơ sở dữ liệu như truy vấn trên kho lưu trữ của bạn. Vì vậy, bạn có thể làm một cái gì đó như thế này:

options = { 
query: '(author:"% Doe") AND (format:"pdf")', 
limit: [0, 100], 
sort_on: [['last_modified', 'descending'], ['creation_date', 'descending']], 
select_list: ['title'], 
wildcard_character: '%' 
}; 

// run query 
jio_instance.allDocs(options, function (error, response) { 
    // do sth 
}); 

Hãy cho tôi biết nếu bạn có bất kỳ câu hỏi nào.

2

Bạn có nghe nói về "điều kiện chủng tộc" [1] về các cuộc gọi ajax không? Có một giải pháp [2], làm thế nào bạn có thể thực hiện cuộc gọi ajax của bạn đến máy chủ của bạn tuần tự thay vì đồng thời và do đó chúng được chạy theo thứ tự sau đó một sau đó khác. Điều này làm việc với kết nối asyncronous, vì vậy bất kỳ điều đồng bộ khác là không cần thiết.

Bí quyết ở đây là sử dụng jQuery ajaxQueue [3] cho mục đích đó.

nguồn của tôi:

[1] http://en.wikipedia.org/wiki/Race_condition

[2] How to make all AJAX calls sequential?

[3] http://plugins.jquery.com/ajaxqueue/

2

Đối với xác thực người dùng trong khi không kết nối với mạng tôi sẽ gợi ý sau đường dẫn:

Trong điểm # 2 bạn đang tải dữ liệu dạng qua internet. Vì vậy, rõ ràng bạn sẽ phải lưu cặp tên người dùng và mật khẩu ở định dạng được mã hóa bên trong bộ nhớ cục bộ. Đó là điều duy nhất sẽ giúp bạn trong khi xác thực cùng một người dùng trên cùng một thiết bị trong khi truy cập ứng dụng ở vùng xa, tức là ở chế độ ngoại tuyến. Các thiết bị cầm tay cuối cùng là cho mỗi người dùng và ứng dụng của bạn sẽ chỉ giữ lịch sử của người dùng đó; đó là tôi nghĩ hoàn toàn tốt trong kịch bản như vậy.

Để tránh va chạm; tôi sẽ đề xuất tăng số lần thiết bị được đồng bộ hóa với máy chủ chính. Nếu người dùng trong mạng và họ thực hiện một số sửa đổi đối với dữ liệu thì thao tác đồng bộ hóa nền phải đồng bộ hóa những thay đổi đó với máy chủ chính và những người dùng khác sẽ được đồng bộ hóa sau khoảng thời gian được xác định trước. Thêm thời gian bạn đồng bộ hóa dữ liệu; ít hơn là cơ hội xung đột. Nhưng một lần nữa câu hỏi vẫn còn về việc sửa đổi đã xảy ra với dữ liệu trong khi người dùng đang ở chế độ ngoại tuyến. Đối với điều này, chúng tôi không thể làm bất cứ điều gì. Mã quản lý xung đột của bạn nên có một số thông tin tình báo giống như bản sao dữ liệu cần có nhiều tùy chọn hơn, tức là dữ liệu đến từ người dùng X có vai trò bảo mật HOẶC dữ liệu đến từ người dùng Y có vai trò bảo mật B hoặc thứ gì đó tương tự.