2016-04-18 13 views
5

Tôi đang làm việc trên một ứng dụng mà chúng tôi đang nghiên cứu khả năng sử dụng jsonapi để mô tả dữ liệu trong tất cả các phản hồi API. Nó hoạt động khá tốt cho các thực thể giống như tài nguyên, nhưng chúng tôi đang gặp một số vấn đề nảy sinh với cách mô tả dữ liệu báo cáo theo cách giống như jsonapi.Trình bày dữ liệu tổng hợp phi tài nguyên với JSON API

Theo dữ liệu báo cáo, tôi tham khảo dữ liệu được tổng hợp và tính toán nhanh chóng từ dữ liệu cơ sở giống như tài nguyên mà chúng tôi lưu trữ trong cơ sở dữ liệu của mình. Ví dụ, hãy tưởng tượng chúng tôi lưu trữ thông tin bất động sản và chúng tôi có thông tin về nhà ở, căn hộ và không gian văn phòng, mỗi vị trí được liên kết với vị trí, kích thước của tài sản bằng feet vuông, loại tài sản (thời tiết là nhà, căn hộ hoặc không gian văn phòng), và mọi thông tin liên quan khác về tài sản. Bây giờ hãy tưởng tượng chúng ta cần một báo cáo nhận được ?group_by[]=location&group_by[]=type và chúng tôi muốn phản hồi để truyền tải thông tin tổng hợp về giao điểm của hai tham số group_by đó. Vì vậy, chúng tôi sẽ nhận được ví dụ, một đối tượng có chứa diện tích chân vuông trung bình của tất cả các thuộc tính trong một vị trí nhất định, cũng được nhóm theo loại thuộc tính.

Average Property Sizes (in square feet) 
       Houses Apartments Offices 
Manhattan  1234.56  234.56 123.45 
Cape Coral  456.78  654.32 876.54 
Portland  4321.00  987.65 2345.67 

Điều quan trọng nhất mà chúng tôi có thể nghĩ đến từ dữ liệu này là mỗi ô, nhưng vì chúng là kết quả của việc tính toán dữ liệu cơ bản hơn, chúng không có ID tự nhiên. Chúng tôi cũng đã suy nghĩ về việc phân phối chúng với ID được tính (có thể kết hợp ID của thứ nguyên theo đó dữ liệu của chúng được nhóm, tức là "house,34" trong đó house đại diện cho loại thuộc tính và 34 là ID của vị trí "Manhattan"). Sau đó, mỗi ô sẽ có mối quan hệ với bản ghi vị trí tương ứng, sẽ được bao gồm trong phần included của tải trọng. Dưới đây là tệp mẫu json về cách thức trông giống như sau:

{ 
    "data": [ 
    { 
     "id": "house,123", 
     "type": "report_items", 
     "attributes": { 
     "property_type": "house", 
     "value": 108.75 
     }, 
     "relationships": { 
     "location": { 
      "data": { 
      "type": "locations", 
      "id": 123 
      } 
     } 
     } 
    }, 
    { 
     "id": "house,124", 
     "type": "report_items", 
     "attributes": { 
     "property_type": "house", 
     "value": 36.0 
     }, 
     "relationships": { 
     "location": { 
      "data": { 
      "type": "locations", 
      "id": 124 
      } 
     } 
     } 
    }, 
    { 
     "id": "house,125", 
     "type": "report_items", 
     "attributes": { 
     "property_type": "house", 
     "value": 1.0 
     }, 
     "relationships": { 
     "location": { 
      "data": { 
      "type": "locations", 
      "id": 125 
      } 
     } 
     } 
    }, 
    { 
     "id": "office,123", 
     "type": "report_items", 
     "attributes": { 
     "property_type": "office", 
     "value": 4.0 
     }, 
     "relationships": { 
     "location": { 
      "data": { 
      "type": "locations", 
      "id": 123 
      } 
     } 
     } 
    }, 
    { 
     "id": "office,124", 
     "type": "report_items", 
     "attributes": { 
     "property_type": "office", 
     "value": 2.0 
     }, 
     "relationships": { 
     "location": { 
      "data": { 
      "type": "locations", 
      "id": 124 
      } 
     } 
     } 
    }, 
    { 
     "id": "apartment,123", 
     "type": "report_items", 
     "attributes": { 
     "property_type": "apartment", 
     "value": 2.0 
     }, 
     "relationships": { 
     "location": { 
      "data": { 
      "type": "locations", 
      "id": 123 
      } 
     } 
     } 
    }, 
    { 
     "id": "apartment,125", 
     "type": "report_items", 
     "attributes": { 
     "property_type": "apartment", 
     "value": 4.5 
     }, 
     "relationships": { 
     "location": { 
      "data": { 
      "type": "locations", 
      "id": 125 
      } 
     } 
     } 
    }, 
    { 
     "id": "apartment,124", 
     "type": "report_items", 
     "attributes": { 
     "property_type": "apartment", 
     "value": 2.0 
     }, 
     "relationships": { 
     "location": { 
      "data": { 
      "type": "locations", 
      "id": 124 
      } 
     } 
     } 
    } 
    ], 
    "included": [ 
    { 
     "type": "locations", 
     "id": "123", 
     "attributes": { 
     "name": "Manhattan" 
     } 
    }, 
    { 
     "type": "locations", 
     "id": "124", 
     "attributes": { 
     "name": "Cape Coral" 
     } 
    }, 
    { 
     "type": "locations", 
     "id": "125", 
     "attributes": { 
     "name": "Portland" 
     } 
    } 
    ] 
} 

Câu hỏi của tôi là: đây có phải là cách thích hợp để thể hiện loại dữ liệu này trong jsonapi không? Jsonapi có phù hợp và/hoặc được đề xuất cho dữ liệu không trực tiếp ánh xạ tới tài nguyên không? Tôi sẽ tốt hơn đại diện cho dữ liệu này trong json tùy chỉnh? Tôi biết không phải những câu hỏi này có thể có câu trả lời rõ ràng, nhưng có lẽ đã có một số kinh nghiệm về cách tiếp cận các kịch bản tương tự, ưu và nhược điểm của việc cố gắng làm cho loại dữ liệu này phù hợp với jsonapi, v.v. Nhiều đánh giá cao. Cảm ơn.

PS: Tôi đã đăng bài này ngay cả sau khi đào bới diễn đàn và trên internet, và đây là hai liên kết duy nhất tôi tìm thấy nói về thứ gì đó mà tôi đang cố gắng tìm hiểu và tôi bao gồm vào đây để tham khảo cũng như: 1.- http://discuss.jsonapi.org/t/composite-id-inside-the-resource-object/367/13 2.- http://discuss.jsonapi.org/t/extension-for-chart-graph-data/408

+0

Tôi không yêu cầu một giải pháp cụ thể cho trường hợp cụ thể này, nhưng đối với một số thông tin liên quan đến khả năng sử dụng API JSON cho loại dữ liệu phi tài nguyên này. Được khuyến nghị? Tôi có nên nỗ lực nhiều hơn trong việc cố gắng điều chỉnh dữ liệu của mình sang JSON API không? Hoặc có lẽ JSON API được thiết kế để được sử dụng cụ thể với dữ liệu giống như tài nguyên? – Ernesto

Trả lời

3

Câu trả lời chung là phải xem xét mà dữ liệu là đáng kể, đủ để đảm bảo một sắc trên cả hai mặt của API của bạn. Bằng cách này, tôi muốn quyết định những điều bạn muốn tham khảo sau này hoặc đại diện cho các mối quan hệ. JSON API cho phép bạn xác định những thứ đó dưới dạng tài nguyên và cho phép bạn kết hợp các tài nguyên với JSON chung chung hơn cho dữ liệu bị mờ. Ví dụ:

Ví dụ: có thể reports và các tùy chọn và bộ lọc mà bạn đã sử dụng để tạo chúng là giá trị theo dõi để khách hàng có thể yêu cầu xem cùng một báo cáo mới theo số id. Có thể bạn muốn thăm dò ý kiến ​​máy chủ của mình để xem báo cáo nào đang được tạo.

Ở phía máy khách, bạn có thể muốn hiển thị các liên kết từ property_type tài nguyên để biết thêm thông tin về các loại thuộc tính đó.

Hoặc có lẽ kết quả trong báo cáo được thể hiện tốt hơn dưới dạng blob của JSON trong tài nguyên. attributesmeta có thể chứa bất kỳ loại giá trị JSON nào.

Trong trường hợp cụ thể của bạn, tài nguyên chính của bạn có thể là loại reports, hoặc một mảng của report_items, hoặc thậm chí một mảng của property_summaries với các mối quan hệ để property_typeslocations.

Nếu bạn chọn nhiều loại tài nguyên chung hơn, bạn có thể khái quát hóa quy trình báo cáo, nhưng bạn có thể không nắm bắt được tầm quan trọng của dữ liệu.

Nếu bạn chọn tài nguyên rất cụ thể để báo cáo, bạn sẽ cần phải tùy chỉnh từng loại báo cáo, nhưng bạn sẽ có thể tạo các kết nối có ý nghĩa giữa các tài nguyên của mình trên ứng dụng khách.

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