ORM là gì, nó hoạt động như thế nào và tôi nên sử dụng nó như thế nào? [đóng cửa]


230

Có người đề nghị tôi sử dụng ORM cho một dự án mà tôi đang thiết kế, nhưng tôi gặp khó khăn khi tìm thông tin về nó là gì hoặc cách thức hoạt động.

Bất cứ ai cũng có thể cho tôi một lời giải thích ngắn gọn về ORM là gì và cách thức hoạt động cũng như cách tôi nên bắt đầu sử dụng nó?


8
Tôi đã tìm thấy câu hỏi này nhưng đó là từ năm 2009 và tôi không biết liệu bạn đã thành thạo ORM chưa nhưng hãy tìm Entity Framework trong CodePlex C # ( entityframework.codeplex.com ) Đây là mã nguồn mà bạn có thể tìm hiểu. Ngoài ra bạn có thể đọc này. ( dbtechnet.org/labs/dae_lab/Orm.pdf )
Maximus Decimus

1
Chỉ muốn chỉ ra rằng cam ORM cũng liên quan đến Mô hình hóa vai trò đối tượng en.wikipedia.org/wiki/Object-role_modeling
O-9

1
Đây là một câu hỏi hữu ích và phiếu bầu cho câu trả lời hàng đầu dường như xác nhận điều đó. Một mô tả ngắn gọn về những gì ORM không yêu cầu ý kiến. Chỉ vì người dùng yêu cầu một liên kết để bắt đầu câu hỏi được gắn cờ ngoài chủ đề. Tôi cảm thấy rằng đây là một phản ứng quá mức thường xuyên từ người điều hành.
NeilG

3
@NeilG Một câu hỏi đóng có nghĩa là câu hỏi ngoài chủ đề. Có thể có thông tin hữu ích trong các câu trả lời, nhưng điều đó không làm cho câu hỏi về chủ đề. Ngoài ra, nó sẽ không bị xóa, nó sẽ ở lại đây, nhưng chúng ta vẫn cần giữ cho SO sạch sẽ và theo chủ đề để nó hoạt động tốt nhất. Vì vậy, để trả lời bình luận đầu tiên của bạn: Đây không phải là một câu hỏi hữu ích, có những câu trả lời hữu ích.
M--

1
@NeilG Vấn đề là câu hỏi bao gồm yêu cầu tài nguyên (cả trong tiêu đề và trong câu hỏi). Các yêu cầu như vậy không có chủ đề, phần lớn là do kết quả là mọi người chỉ đăng một liên kết đến tài nguyên yêu thích của họ, như đã xảy ra trong một số câu trả lời ở đây. Xóa yêu cầu tài nguyên khỏi câu hỏi sẽ làm mất hiệu lực một số câu trả lời hiện có. Là người dùng thông thường, chúng tôi không được phép chỉnh sửa câu hỏi để vô hiệu hóa câu trả lời. Vì vậy, nó nên được đóng lại. Nếu câu hỏi chưa được trả lời, thì nó có thể được chỉnh sửa để xóa những yêu cầu đó và bỏ ngỏ.
Makyen

Câu trả lời:


483

Giới thiệu

Ánh xạ quan hệ đối tượng (ORM) là một kỹ thuật cho phép bạn truy vấn và thao tác dữ liệu từ cơ sở dữ liệu bằng cách sử dụng mô hình hướng đối tượng. Khi nói về ORM, hầu hết mọi người đều đề cập đến một thư viện thực hiện kỹ thuật Lập bản đồ quan hệ đối tượng, do đó cụm từ "một ORM".

Thư viện ORM là một thư viện hoàn toàn bình thường được viết bằng ngôn ngữ bạn chọn, đóng gói mã cần thiết để thao tác dữ liệu, vì vậy bạn không sử dụng SQL nữa; bạn tương tác trực tiếp với một đối tượng trong cùng ngôn ngữ bạn đang sử dụng.

Ví dụ, đây là một trường hợp hoàn toàn tưởng tượng với ngôn ngữ giả:

Bạn có một lớp sách, bạn muốn lấy tất cả những cuốn sách mà tác giả là "Linus". Theo cách thủ công, bạn sẽ làm một cái gì đó như thế:

book_list = new List();
sql = "SELECT book FROM library WHERE author = 'Linus'";
data = query(sql); // I over simplify ...
while (row = data.next())
{
     book = new Book();
     book.setAuthor(row.get('author');
     book_list.add(book);
}

Với thư viện ORM, nó sẽ trông như thế này:

book_list = BookTable.query(author="Linus");

Phần cơ học được chăm sóc tự động thông qua thư viện ORM.

Ưu và nhược điểm

Sử dụng ORM giúp tiết kiệm rất nhiều thời gian vì:

  • DRY : Bạn chỉ viết mô hình dữ liệu của mình ở một nơi và việc cập nhật, duy trì và sử dụng lại mã dễ dàng hơn.
  • Rất nhiều thứ được thực hiện tự động, từ xử lý cơ sở dữ liệu đến I18N .
  • Nó buộc bạn phải viết mã MVC , cuối cùng, làm cho mã của bạn sạch hơn một chút.
  • Bạn không cần phải viết SQL kém hình thành (hầu hết các lập trình viên Web thực sự thích nó, bởi vì SQL được coi như ngôn ngữ "phụ", trong thực tế, nó là một ngôn ngữ rất mạnh mẽ và phức tạp).
  • Vệ sinh; sử dụng các báo cáo hoặc giao dịch được chuẩn bị dễ dàng như gọi một phương thức.

Sử dụng thư viện ORM linh hoạt hơn vì:

  • Nó phù hợp với cách mã hóa tự nhiên của bạn (đó là ngôn ngữ của bạn!).
  • Nó trừu tượng hóa hệ thống DB, vì vậy bạn có thể thay đổi nó bất cứ khi nào bạn muốn.
  • Mô hình bị ràng buộc yếu với phần còn lại của ứng dụng, vì vậy bạn có thể thay đổi hoặc sử dụng nó ở bất kỳ nơi nào khác.
  • Nó cho phép bạn sử dụng tính tốt của OOP như kế thừa dữ liệu mà không phải đau đầu.

Nhưng ORM có thể là một nỗi đau:

  • Bạn phải học nó và các thư viện ORM không phải là công cụ nhẹ;
  • Bạn phải thiết lập nó. Vấn đề tương tự.
  • Hiệu suất ổn đối với các truy vấn thông thường, nhưng một bậc thầy SQL sẽ luôn làm tốt hơn với SQL của riêng mình cho các dự án lớn.
  • Nó trừu tượng hóa DB. Mặc dù không sao nếu bạn biết những gì xảy ra đằng sau hậu trường, đó là một cái bẫy cho các lập trình viên mới có thể viết những tuyên bố rất tham lam, giống như một cú đánh nặng nề trong một forvòng lặp.

Làm thế nào để tìm hiểu về ORM?

Vâng, sử dụng một. Cho dù bạn chọn thư viện ORM nào, tất cả đều sử dụng các nguyên tắc giống nhau. Có rất nhiều thư viện ORM ở đây:

Nếu bạn muốn thử một thư viện ORM trong lập trình Web, tốt hơn hết bạn nên sử dụng toàn bộ ngăn xếp khung như:

  • Symfony (PHP, sử dụng Propel hoặc Học thuyết).
  • Django (Python, sử dụng ORM nội bộ).

Đừng cố viết ORM của riêng bạn, trừ khi bạn đang cố gắng học một cái gì đó. Đây là một công việc khổng lồ, và những người cũ đã mất rất nhiều thời gian và công việc trước khi chúng trở nên đáng tin cậy.


50

Ai đó có thể cho tôi một lời giải thích ngắn gọn ...

Chắc chắn rồi.

ORM là viết tắt của "Đối tượng lập bản đồ quan hệ" trong đó

  • Phần Object là phần bạn sử dụng với ngôn ngữ lập trình của bạn (python trong trường hợp này)

  • Phần quan hệ là Hệ thống quản lý cơ sở dữ liệu quan hệ (Cơ sở dữ liệu) có các loại cơ sở dữ liệu khác nhưng phổ biến nhất là quan hệ (bạn biết bảng, cột, pk fk, v.v. ví dụ: Oracle MySQL, MS-SQL)

  • Và cuối cùng, phần Ánh xạ là nơi bạn làm cầu nối giữa các đối tượng và các bảng của bạn.

Trong các ứng dụng mà bạn không sử dụng khung ORM, bạn sẽ thực hiện việc này bằng tay. Sử dụng khung ORM sẽ cho phép bạn giảm bớt phần soạn sẵn cần thiết để tạo giải pháp.

Vì vậy, hãy nói rằng bạn có đối tượng này.

 class Employee:
      def __init__( self, name ): 
          self.__name = name

       def getName( self ):
           return self.__name

       #etc.

và cái bàn

   create table employee(
          name varcar(10),
          -- etc  
    )

Sử dụng khung ORM sẽ cho phép bạn ánh xạ đối tượng đó với bản ghi db tự động và viết một cái gì đó như:

   emp = Employee("Ryan")

   orm.save( emp )

Và có nhân viên chèn vào DB.

Rất tiếc nó không ngắn gọn nhưng tôi hy vọng nó đủ đơn giản để bắt các bài viết khác mà bạn đọc.


17

ORM (Object Relative Mapper) là một phần / lớp phần mềm giúp ánh xạ mã Đối tượng vào cơ sở dữ liệu của bạn.

Một số xử lý nhiều khía cạnh hơn các khía cạnh khác ... nhưng mục đích là lấy một phần trọng lượng của Lớp dữ liệu khỏi vai của nhà phát triển.

Đây là một đoạn phim ngắn từ Martin Fowler (Data Mapper):

Các mô hình dữ liệu kiến ​​trúc ứng dụng doanh nghiệp


4

Giống như tất cả các từ viết tắt mơ hồ, nhưng tôi cho rằng chúng có nghĩa là người lập bản đồ quan hệ đối tượng - một cách để che mắt bạn và tin rằng không có SQL bên dưới, mà là tất cả các đối tượng ;-). Tất nhiên, không thực sự đúng và không phải không có vấn đề - Jeff Atwood luôn đầy màu sắc đã mô tả ORM là Việt Nam của CS ;-). Nhưng, nếu bạn biết ít hoặc không có SQL và có một vấn đề khá đơn giản / quy mô nhỏ, chúng có thể giúp bạn tiết kiệm thời gian! -)


2

Mô hình đối tượng liên quan đến ba khái niệm sau đây Kế thừa mã hóa tóm tắt dữ liệu Mô hình quan hệ đã sử dụng khái niệm cơ bản của một quan hệ hoặc bảng. Các sản phẩm ánh xạ quan hệ đối tượng (ánh xạ OR) tích hợp khả năng ngôn ngữ lập trình đối tượng với cơ sở dữ liệu quan hệ.

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.