Cách xử lý các trường được tính toán phức tạp trong ORM


8

Trong API của chúng tôi, chúng tôi đã có một vài kiểu dữ liệu trung tâm cần được "trang trí" (có thể nói) sau khi truy xuất từ ​​cơ sở dữ liệu với các giá trị được tính toán. Cơ sở dữ liệu được truy cập thông qua ORM theo động của Bảng / Thực thể được truyền cảm hứng mạnh mẽ bởi lớp cơ sở dữ liệu CakePHP 3, trong đó đối tượng Bảng được sử dụng làm trung gian giữa cơ sở dữ liệu và ứng dụng nhận và xử lý các hàng làm đối tượng mô hình. Vì vậy, thay vì chỉ lấy dữ liệu từ cơ sở dữ liệu và trả về các hàng đó, chúng ta cần xử lý trước dữ liệu được trả về trước khi thực sự có thể sử dụng được. Dưới đây là một vài trường hợp sử dụng được đưa ra để giải thích rõ hơn ý tôi là gì:

  • Các đối tượng có các giá trị số được dịch sang nhãn thân thiện với người dùng (thông thường đây là logic mà tôi giữ hoàn toàn trên máy khách, nhưng vì lý do bảo mật kinh doanh, một số dữ liệu này chỉ cần được giữ trên máy chủ, phải thừa nhận một chút trường hợp cạnh)
  • Các đối tượng cần phải có một giá trị xếp hạng liên quan được lấy từ xếp hạng được thêm gần đây nhất
  • Dựa trên sự kết hợp của các giá trị được tính toán như giá trị này và giá trị được lưu trữ, một đối tượng lịch biểu phức tạp được xây dựng

Theo cách riêng của họ, bất kỳ cá nhân nào trong số này thực sự khá dễ thực hiện với một map()thao tác đơn giản trên tập kết quả được trả về. Điều tương tự áp dụng cho khi bạn muốn nhiều giá trị được tính toán, bạn chỉ có thể thực hiện thêm các thao tác bản đồ để tính toán và thêm các trường đó khi cần thiết.

Điều đó nói rằng, phương pháp này có hai nhược điểm chính:

  1. Điều đó có nghĩa là bạn cần thực hiện thêm một bước xử lý hậu kỳ ở mọi nơi bạn muốn làm việc với các giá trị được tính toán này, không đặc biệt là DRY
  2. Một số biến đổi này phụ thuộc vào các biến đổi khác được thực hiện trước tiên, nếu không, chúng chỉ không có sẵn dữ liệu để làm việc với

Để xử lý cả hai, tôi đã nghĩ rằng cách tiếp cận tốt nhất sẽ là chuyển mã này vào ORM, sau đó sửa đổi ORM để giao diện (bên ngoài) cho phép truy cập vào các trường ảo được tính giống như cách nó xử lý các cột cơ sở dữ liệu . Trong nội bộ, sau đó nó có thể ánh xạ các trường ảo này tới các hàm biến đổi và xác định bên trong bất kỳ phép biến đổi phụ thuộc cần thiết tiềm năng nào để giải quyết vấn đề thứ hai.

(Bên cạnh đó, tôi tự hỏi liệu điều này cũng loại bỏ sự cần thiết của các hàng được trả về là các đối tượng thực tế trái ngược với các giá trị băm đơn giản. Ngay bây giờ mỗi hàng sẽ tạo một đối tượng mới với dữ liệu trường được đặt trên nó, nhưng nếu tất cả tính toán hoặc sửa đổi dữ liệu được chuyển ra khỏi mô hình sau đó đối tượng chỉ trở thành một túi thuộc tính - một hashmap, về cơ bản, không có logic bên trong của chính nó. Tôi có thể không thực sự là một điều xấu)


Làm thế nào điều này đi @moberemk?
Slamice 22/03/2016

Nếu quá khó với ORM, bạn có thể sử dụng truy vấn SQL gốc. Thông thường ORM cung cấp cách thực hiện truy vấn SQL an toàn vì họ biết rõ rằng họ không thể xử lý mọi tình huống hơn mức có thể được thực hiện trong SQL thô.
Walfrat

Câu trả lời:


3

Bạn có thể sử dụng lớp giống như kho lưu trữ cho các trường hợp đã nói ở trên.

[Kho lưu trữ] Trung gian giữa các lớp ánh xạ dữ liệu và miền bằng cách sử dụng giao diện giống như bộ sưu tập để truy cập các đối tượng miền.

Một kho lưu trữ cho mỗi trường hợp, sử dụng ORM để đọc dữ liệu, làm phong phú chúng và trả về.

Vì vậy, bạn sẽ có một cách thống nhất để truy cập các trường hợp như vậy và ẩn cách các trường hợp đó được tạo từ bên ngoài. Ngoài ra, điều này sẽ cho phép bạn chuyển từ ORM sang các truy vấn SQL thô mà không thay đổi giao diện tiếp xúc.


Đây là những gì tôi đã làm cho dự án này về cơ bản, nhưng tôi muốn lưu ý rằng có vấn đề hiệu năng lớn với điều này trên các bộ dữ liệu lớn. Về cơ bản: nó hoạt động, chỉ là không ở quy mô. Chấp nhận cho chính xác mặc dù.
moberemk

0

Tôi đồng ý với @potfur. Việc phân tách giữa các "đối tượng dữ liệu", biểu diễn dữ liệu trong cơ sở dữ liệu và biểu diễn "doanh nghiệp" của chúng, đóng gói logic bổ sung, tính toán, v.v. là IMHO đúng hướng. Làm thế nào dữ liệu được biểu diễn cho tên miền / doanh nghiệp nhất định và sau đó được lưu trữ về mặt kỹ thuật, có thể là những thứ hoàn toàn khác nhau. Việc triển khai logic nghiệp vụ với các đối tượng đại diện cho miền giúp thêm giá trị cho khách hàng và giúp việc giao tiếp trở nên dễ dàng hơn. Đối với ORM, bạn đề cập đến các vấn đề về khả năng mở rộng. Tôi nghĩ rằng một ORM là một mô hình chống. Mặc dù rất hữu ích ở quy mô nhỏ hơn / trung bình, nhưng khi nói đến khả năng mở rộng, nó bắt đầu thất bại. Những gì bạn có thể làm là thêm một lớp bộ đệm cho "thực thể kinh doanh", vì vậy bạn không phải tính toán chúng mỗi lần.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.