6

Ánh xạ đối tượng-quan hệ, ORM là một vấn đề cần được giải quyết trong tất cả các ứng dụng được thực hiện trong ngôn ngữ lập trình hướng đối tượng và sử dụng cơ sở dữ liệu quan hệ.ORM có phải là vấn đề cụ thể đối với lập trình hướng đối tượng không?

Nhưng không phải là vấn đề tương tự nếu bạn đang sử dụng cấu trúc để ánh xạ cơ sở dữ liệu quan hệ trong C? Và tuples/hồ sơ trong một ngôn ngữ lập trình chức năng? Hoặc tôi thiếu một cái gì đó kể từ khi tôi đã không viết một ứng dụng cơ sở dữ liệu trong C hoặc trong một ngôn ngữ chức năng.

Trả lời

6

Vâng, cả hai có và không.

Những gì bạn đang đề cập đến được gọi là Object-Relational impedance mismatch, đó là sự cố chuyển dữ liệu giữa mô hình hướng đối tượng và mô hình Mối quan hệ thực thể.Khó khăn là do các cách khác nhau về mặt cấu trúc và lưu trữ thông tin trong hai mô hình, trong đó OO là phân cấp trong khi ER là bảng.

Object-Relational Mapping là một kỹ thuật cố gắng giải quyết vấn đề không phù hợp với trở kháng đối tượng-Quan hệ.

Thuật ngữ không phù hợp trở kháng đối tượng-Quan hệ cụ thể đối với các mô hình Object-OrientedEntity-Relationship. Tuy nhiên, từ "trở kháng" nghĩa là kháng hoặc khó, do đó thuật ngữ "không phù hợp trở kháng" có thể được sử dụng để diễn tả vấn đề chung về ánh xạ giữa hai hệ thống kiểu/mô hình dữ liệu không tương thích.

3

Các vấn đề chính trong ORM không phải là xử lý các tính năng đơn giản, như ánh xạ cột "x" đến trường struct "x". Điều đó có thể được thực hiện bằng một số thủ thuật (macro, gen mã, phản chiếu, v.v.).

Vấn đề là cách xử lý các tính năng OOP như thừa kế, thành phần, tham chiếu, đối tượng duy nhất, giao diện, v.v. Thừa kế là một bitch theo nghĩa này, vì việc triển khai ngây thơ của nó dưới dạng nhiều bảng không tối ưu.

5

Anecdotally, ít nhất, "không phù hợp trở kháng" này dường như là đặc biệt với các tình huống mà người ta muốn đẩy quan hệ vào một thành ngữ đối tượng.

Trong C hầu hết các API cơ sở dữ liệu có khuynh hướng hiển thị các tập kết quả dưới dạng mảng đa chiều, chứ không phải là cấu trúc. Do đó, người ta chỉ đơn giản là truy cập dữ liệu ở cùng định dạng như nó tồn tại trong bảng trong cơ sở dữ liệu - nó không quan trọng vì nó bây giờ tồn tại như một bản sao dữ liệu cục bộ, thay vì "trong cơ sở dữ liệu".

Hầu hết các thư viện RDBMS chức năng phơi bày các hàng cơ sở dữ liệu dưới dạng các loại bản ghi, tương ứng ở mức độ hợp lý cho các hàng cơ sở dữ liệu gần như hoàn hảo. Không có "trở kháng không phù hợp" trong tình huống này.

Wikipedia article trên chủ đề xuất hiện để suy đoán về một số lý do khiến mô hình đối tượng đặc biệt dễ bị sự không phù hợp này.

Niềm tin của tôi là bản chất thực chất là bản lề trên thực tế là bạn luôn xây dựng biểu diễn thứ cấp của dữ liệu (tức là "chồng" đối tượng "). Trong hầu hết các ngôn ngữ chức năng bắt buộc hoặc (không phải đối tượng), một ngôn ngữ ít có khả năng xây dựng một đại diện thứ cấp lớn, không liên quan đến ngữ nghĩa của dữ liệu của bạn. Nếu một người sẽ xây dựng một đại diện thứ cấp trong thế giới đó, nó có nhiều khả năng là một trừu tượng trừu tượng của một số loại. Điều này tương ứng với một niềm tin cơ bản (không được chứng minh) của tôi rằng mô hình OOP về cơ bản là búa trung gian khiến mọi vấn đề trông giống như một cái đinh.

3

Bạn có 2 trở kháng không phù hợp.

  1. Ghi lại đối tượng.
  2. Ngôn ngữ của bạn đối với truy vấn SQL.

Trong khi không phù hợp trở kháng đầu tiên có thể không làm việc cho tất cả các ngôn ngữ không phải OOP thứ hai là appearant trong mọi ngôn ngữ và có thể được giải quyết bằng DSL của as seen here

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