Tôi đang viết luận án về khả năng ngoại tuyến của các ứng dụng web. Nhiệm vụ của tôi là thể hiện khả năng lưu trữ ngoại tuyến thông qua một ứng dụng web với cơ sở dữ liệu quan hệ phía máy chủ và lưu lượng truy cập Ajax/JSON giữa máy khách và máy chủ. Triển khai đầu tiên của tôi đã sử dụng một cách tiếp cận với localStorage, lưu từng phản hồi Ajax dưới dạng giá trị với URL yêu cầu làm khóa. Ứng dụng này hoạt động tốt. Tuy nhiên, trong bước tiếp theo, tôi muốn (nghĩa là luận án yêu cầu) triển khai phiên bản nâng cao hơn với cơ sở dữ liệu phía máy khách. Vì máy chủ duy trì một cơ sở dữ liệu quan hệ, nên cơ sở dữ liệu Web SQL sẽ là lựa chọn trực quan. Nhưng, như chúng ta biết, tiêu chuẩn không được chấp nhận và tôi không muốn sử dụng một công nghệ mà tương lai không chắc chắn. Vì vậy, tôi muốn sử dụng IndexedDB để thực hiện logic cơ sở dữ liệu phía máy khách. Thật không may, sau khi đọc rất nhiều tài liệu trên web mà chủ yếu là giữ rất nhiều trầy xước bề mặt (todo-ghi chú ứng dụng vv), tôi vẫn không biết làm thế nào để tiến hành.Các vấn đề khái niệm với IndexedDB (các mối quan hệ vv)
Tác vụ của tôi có vẻ khá đơn giản: triển khai cơ sở dữ liệu phía máy chủ trên máy khách với IndexedDB để sao chép tất cả dữ liệu đã được lấy từ máy chủ. Những vấn đề, mà làm này ít đơn giản là:
- Cơ sở dữ liệu phía máy chủ được quan hệ, IndexedDB là (nhiều hơn hoặc ít hơn) hướng đối tượng
- Không có cách nào trực quan để đồng bộ hóa khách hàng- và Server- cơ sở dữ liệu bên
- không có cách nào trực quan để thực hiện các mối quan hệ trong IndexedDB được thực hiện với các phím nước ngoài và tham gia vào máy chủ
Ngay bây giờ, tôi có một khái niệm trong tâm trí mà tôi thực sự sợ để bắt đầu triển khai. Tôi đã nghĩ về việc tạo một cửa hàng đối tượng cho mỗi bảng trong cơ sở dữ liệu máy chủ và lập trình các đối tượng quan hệ trong các cửa hàng đối tượng khác nhau theo cách thủ công. Trong ứng dụng của tôi, trong đó, trong ngắn hạn, quản lý các khóa học của một trường đại học, tôi muốn có 7 cửa hàng đối tượng.
tôi muốn chứng minh ý tưởng của tôi với một ví dụ cho một phản ứng JSON từ máy chủ (/ * đây là những ý kiến * /):
{ "course": { /* course object */
"id":1,
"lecturer": { "id":"1", /* lecturer object with many attributes */ },
"semester": { "id":"1", /* semester object with many attributes */ },
/* more references and attributes */
}}
Các thuật toán để cửa hàng dữ liệu với IndexedDB sẽ lưu trữ mỗi đối tượng áp dụng cho một đối tượng lưu trữ trong kho lưu trữ đối tượng thích hợp và thay thế các đối tượng có tham chiếu đến các đối tượng này. Ví dụ, đối tượng dĩ nhiên ở trên sẽ giống như sau trong các cửa hàng đối tượng 'nhiên':
{ "course": { /* course object */
"id":1,
"lecturer":
{ "reference": { /* reference to the lecturer in the object store 'lecturer' */
"objectstore":"lecturer",
"id":"1" }
},
"semester":
{ "reference": { /* reference to the semester in the object store 'semester' */
"objectstore":"semester",
"id":"1" }
}
/* more references and attributes */
}}
Các thuật toán để lấy dữ liệu với IndexedDB sau đó sẽ thực hiện như sau (Tôi có một mẫu đệ quy mơ hồ trong tâm trí):
Retrieve the course object with id=1 from the object store 'course'
For each reference object in the retrieved course object, do
Retrieve the object with id=reference.id from the object store reference.objectstore
Replace the reference object with the retrieved object
Rõ ràng là việc triển khai này sẽ thực sự rườm rà, đặc biệt là do bản chất không đồng bộ của IndexedDB. Nó cũng sẽ dẫn đến nhiều giao dịch khác nhau cho cơ sở dữ liệu chỉ để lấy ra một đối tượng khóa học và hiệu suất sẽ phải chịu rất nhiều (tôi không thực sự biết hiệu suất của các giao dịch IndexedDB trông như thế nào).
Tôi có thể làm điều này tốt hơn và đơn giản hơn bằng cách nào?
Tôi đã xem các chủ đề này đại diện cho các sự cố tương tự: link1, link2.Tôi không thấy bất kỳ giải pháp đơn giản nào trong số này. Hơn nữa, tôi muốn tránh sử dụng một khuôn khổ wrapper IndexedDB do một số lý do.
Tôi cũng có thể tưởng tượng rằng tôi hoàn toàn theo dõi sai với IndexedDB cho vấn đề của mình.
Edit:
cuối cùng tôi đã kết thúc theo đuổi cách tiếp cận của tôi để lưu trữ các tài liệu tham khảo trong các đối tượng chính mình trong IndexedDB. Điều này có thể dẫn đến một số vấn đề về hiệu suất trong trường hợp một lượng lớn dữ liệu có nhiều tham chiếu. Tuy nhiên, nếu được sử dụng một cách thông minh, có thể tránh được một số lượng lớn các lần truy cập cơ sở dữ liệu và lặp lại trong hầu hết các trường hợp, và không cần lưu trữ lược đồ cơ sở dữ liệu phức tạp trong bộ nhớ hoặc trong chính IndexedDB.
Nói chung tôi phải nói, rằng tôi có ấn tượng rằng tôi hiểu sai ý tưởng năng động và thẳng thắn với IndexedDB như một cơ sở dữ liệu schemaless theo một cách nào đó. Nhưng bất cứ điều gì, tôi thực hiện tất cả mọi thứ trong JavaScript, nó hoạt động tốt và không có cơ hội cho bất kỳ mâu thuẫn nào.
Liên kết tới tài khoản đăng bị xóa đã bị hỏng và cũng không phải là một phần của câu hỏi. –