Sự khác biệt giữa Trình ánh xạ dữ liệu, Cổng dữ liệu bảng (Cổng), Đối tượng truy cập dữ liệu (DAO) và các mẫu Kho lưu trữ là gì?


133

Tôi đang cố gắng cải thiện các kỹ năng mẫu thiết kế của mình và tôi tò mò sự khác biệt giữa các mẫu này là gì? Tất cả chúng có vẻ giống nhau - đóng gói logic cơ sở dữ liệu cho một thực thể cụ thể để mã gọi không có kiến ​​thức về lớp lưu giữ cơ bản. Từ nghiên cứu ngắn gọn của tôi, tất cả chúng thường thực hiện các phương pháp CRUD tiêu chuẩn của bạn và loại bỏ các chi tiết cụ thể về cơ sở dữ liệu.

Ngoài các quy ước đặt tên (ví dụ: CustomerMapper so với CustomerDAO so với CustomerGateway so với CustomerRep repository), sự khác biệt là gì, nếu có? Nếu có sự khác biệt, khi nào bạn sẽ chọn cái này hơn cái kia?

Trước đây tôi sẽ viết mã tương tự như sau (đơn giản hóa, tự nhiên - tôi thường không sử dụng các thuộc tính công cộng):

public class Customer
{
    public long ID;
    public string FirstName;
    public string LastName;
    public string CompanyName;
}

public interface ICustomerGateway
{
    IList<Customer> GetAll();
    Customer GetCustomerByID(long id);
    bool AddNewCustomer(Customer customer);
    bool UpdateCustomer(Customer customer);
    bool DeleteCustomer(long id);
}

và có một CustomerGatewaylớp thực hiện logic cơ sở dữ liệu cụ thể cho tất cả các phương thức. Đôi khi, tôi sẽ không sử dụng một giao diện và làm cho tất cả các phương thức trên CustomerGateway tĩnh (tôi biết, tôi biết, điều đó làm cho nó ít kiểm tra hơn) vì vậy tôi có thể gọi nó như sau:

Customer cust = CustomerGateway.GetCustomerByID(42);

Đây dường như là cùng một nguyên tắc cho các mẫu Kho lưu trữ dữ liệu và Kho lưu trữ dữ liệu; mô hình DAO (giống như Gateway, tôi nghĩ vậy?) dường như cũng khuyến khích các cổng cụ thể của cơ sở dữ liệu.

Tui bỏ lỡ điều gì vậy? Có vẻ hơi kỳ lạ khi có 3-4 cách khác nhau để làm cùng một điều chính xác.

Câu trả lời:


96

Điều khoản ví dụ của bạn; DataMapper, DAO, DataTableGateway và Kho lưu trữ, tất cả đều có một mục đích tương tự (khi tôi sử dụng một mục đích, tôi hy vọng sẽ lấy lại một đối tượng Khách hàng), nhưng mục đích / ý nghĩa khác nhau và kết quả thực hiện.

Một Kho "hoạt động như một bộ sưu tập, trừ trường hợp khả năng truy vấn phức tạp hơn" [ Evans, Domain Driven Thiết kế ] và chưa được coi là một "đối tượng trong bộ nhớ mặt tiền" ( cuộc thảo luận Repository )

Một DataMapper "di chuyển dữ liệu giữa các đối tượng và cơ sở dữ liệu trong khi vẫn giữ cho họ độc lập với nhau và mapper chính nó" ( Fowler, PoEAA, Mapper )

Một TableDataGateway"một Gateway (đối tượng mà gói gọn truy cập vào một hệ thống bên ngoài hoặc tài nguyên) vào một bảng cơ sở dữ liệu. Một tay nắm dụ tất cả các hàng trong bảng " ( Fowler, PoEAA, TableDataGateway )

Một DAO "tách giao diện khách hàng một nguồn dữ liệu từ cơ chế truy cập dữ liệu của nó / thích nghi API truy cập một cụ tài nguyên dữ liệu của một giao diện khách hàng chung chung" cho phép "cơ chế truy cập dữ liệu để thay đổi một cách độc lập của mã có sử dụng dữ liệu" ( Sun Blueprints )

Kho lưu trữ có vẻ rất chung chung, không có khái niệm tương tác cơ sở dữ liệu. Một DAO cung cấp một giao diện cho phép sử dụng các triển khai cơ sở dữ liệu cơ bản khác nhau. TableDataGateway đặc biệt là một trình bao bọc mỏng xung quanh một bảng duy nhất. DataMapper hoạt động như một trung gian cho phép đối tượng Model phát triển độc lập với biểu diễn cơ sở dữ liệu (theo thời gian).


15
Trong thực tế, không có sự khác biệt lớn giữa DAO và TableDataGateway và trong [Fowler, PoEAA] [1] họ nói chính xác rằng: "[Alur et al.] [2] thảo luận về mẫu Đối tượng truy cập dữ liệu, là Cổng dữ liệu bảng. .. Tôi đã sử dụng một tên khác, một phần vì tôi thấy mẫu này là một cách sử dụng cụ thể của khái niệm Gateway (466) tổng quát hơn và tôi muốn tên mẫu phản ánh điều đó. " [1]: martinfowler.com/books/eaa.html [2]: books.google.pt/books/about/...
Miguel Gamboa

9
Điểm tốt. Ấn tượng của tôi là định nghĩa PoEAA cung cấp của TableDataGateway hẹp hơn DataAccessObject. Cái trước dường như ngụ ý ánh xạ một đến một với bảng cơ sở dữ liệu (quan hệ), trong đó DAO có thể hoạt động như một Mặt tiền cho nhiều tài nguyên không liên quan cơ bản. Điểm nhấn trong DAO là khả năng thay thế kho dữ liệu cơ bản, điểm nhấn trong TableDataGateway là đóng gói các hoạt động SQL trên một bảng duy nhất (không nhất thiết phải theo kiểu trung tính / di động của kho dữ liệu).
Pierce Hickey

31

Có một xu hướng trong thế giới thiết kế phần mềm (ít nhất, tôi cảm thấy như vậy) để phát minh ra tên mới cho những thứ và mô hình cũ nổi tiếng. Và khi chúng ta có một mô hình mới (có lẽ hơi khác với những thứ đã có), nó thường đi kèm với một tập hợp các tên mới cho mỗi tầng. Vì vậy, "Logic nghiệp vụ" trở thành "Lớp dịch vụ" chỉ vì chúng tôi nói chúng tôi làm SOA và DAO trở thành Kho lưu trữ chỉ vì chúng tôi nói chúng tôi làm DDD (và mỗi trong số chúng thực sự không phải là một cái gì đó mới và duy nhất, nhưng một lần nữa: tên mới cho các khái niệm đã biết được tập hợp trong cùng một cuốn sách). Vì vậy, tôi không nói rằng tất cả các mô hình và từ viết tắt hiện đại này có nghĩa là CHÍNH XÁC giống nhau, nhưng bạn thực sự không nên quá hoang tưởng về nó. Hầu hết đây là những mẫu giống nhau, chỉ từ các gia đình khác nhau.


4
@MladenMihajlovic, chỉ vì bạn không hiểu hoặc không đồng ý, không có nghĩa câu trả lời này không hợp lệ hoặc sự kiện đúng.
Cypher

2
@MladenMihajlovic đó không phải là câu trả lời này. Câu cuối cùng tóm tắt.
Cypher

2
@Cypher Những mẫu này có giống nhau không? Không họ không. Việc thực hiện mẫu cổng khác với việc triển khai mẫu kho lưu trữ. Chúng có thể trông giống như mắt chưa được huấn luyện, nhưng thực tế không phải vậy. Ngoài ra, như Mladen Mihajlovic đã chỉ ra một cách chính xác, Câu trả lời này khá sai. Logic kinh doanh và lớp dịch vụ là hai thứ khác nhau.
Frederik Krautwald

1
@Cypher Nó không thực sự là vấn đề quan điểm, mà là sự thật. Mẫu Gateway được Martin Fowler xây dựng trong PoEAA của mình và chủ yếu liên quan đến các mẫu Facade hoặc Adaptor [GoF]. Điểm khác biệt là Gateway được viết cho một mục đích sử dụng cụ thể và thường không có giao diện hiện có. Cổng, thông thường, chỉ liên quan đến hai đối tượng và tài nguyên được bọc không có kiến ​​thức về Cổng. (tiếp tục ...)
Frederik Krautwald

3
Đây là một nhận xét nhiều hơn là một câu trả lời.
Pétur Ingi Egilsson 16/07/2015

31

Data Mapper vs Table Data Gateway Để viết một câu chuyện dài:

  • Data Mapper sẽ nhận đối tượng Mô hình miền (Thực thể) là param và sẽ sử dụng nó để thực hiện các hoạt động CRUD
  • Cổng dữ liệu bảng sẽ nhận được tất cả các thông số (dưới dạng nguyên thủy) cho các phương thức và sẽ không biết gì về đối tượng Mô hình miền (Thực thể).

    Cuối cùng, cả hai sẽ đóng vai trò trung gian giữa các đối tượng trong bộ nhớ và cơ sở dữ liệu.


  • 6
    liên kết đã cũ
    imel96


    15

    Bạn có một điểm tốt. Chọn một trong những bạn quen thuộc nhất. Tôi muốn chỉ ra một vài điều có thể giúp làm rõ.

    Cổng dữ liệu bảng được sử dụng chủ yếu cho một bảng hoặc dạng xem. Nó chứa tất cả các lựa chọn, chèn, cập nhật và xóa. Vì vậy, Khách hàng là một bảng hoặc một khung nhìn trong trường hợp của bạn. Vì vậy, một thể hiện của một đối tượng cổng dữ liệu bảng xử lý tất cả các hàng trong bảng. Thông thường điều này có liên quan đến một đối tượng trên mỗi bảng cơ sở dữ liệu.

    Trong khi Data Mapper độc lập hơn với bất kỳ logic miền nào và ít được ghép nối hơn (mặc dù tôi tin rằng có khớp nối hoặc không khớp nối). Nó chỉ đơn thuần là một lớp trung gian để chuyển dữ liệu giữa các đối tượng và cơ sở dữ liệu trong khi giữ chúng độc lập với nhau và chính trình ánh xạ.

    Vì vậy, thông thường trong một trình ánh xạ, bạn thấy các phương thức như chèn, cập nhật, xóa và trong cổng dữ liệu bảng, bạn sẽ tìm thấy getcustomerbyId, getcustomerbyName, v.v.

    Đối tượng truyền dữ liệu khác với hai mẫu trên, chủ yếu vì đây là mẫu phân phối chứ không phải mẫu nguồn dữ liệu như hai mẫu trên. Sử dụng nó chủ yếu khi bạn đang làm việc với giao diện từ xa và cần làm cho các cuộc gọi của bạn ít trò chuyện hơn vì mỗi cuộc gọi có thể trở nên đắt đỏ. Vì vậy, thường thiết kế một DTO có thể được tuần tự hóa qua dây có thể mang tất cả dữ liệu trở lại máy chủ để áp dụng các quy tắc kinh doanh hoặc xử lý tiếp theo.

    Tôi không rành về mô hình kho lưu trữ vì tôi không có cơ hội sử dụng cho đến bây giờ nhưng sẽ xem xét câu trả lời của người khác.


    1

    Dưới đây chỉ là sự hiểu biết của tôi.

    TableGateWay / RowDataGateWay : Trong bối cảnh này, Gateway đang đề cập đến một triển khai cụ thể có mỗi "đối tượng miền" ánh xạ tới từng "cổng đối tượng miền". Ví dụ: nếu chúng ta có Person , thì chúng ta sẽ có PersonGateway để lưu trữ đối tượng miền Person vào cơ sở dữ liệu. Nếu chúng ta có Person, Nhân viên, Khách hàng, v.v., chúng ta sẽ có PersonGateway, EmployeeGateway và CustomerGateway. Mỗi cổng sẽ có chức năng CRUD cụ thể cho đối tượng đó và nó không liên quan gì đến cổng khác. Không có mã / mô-đun có thể tái sử dụng ở đây. Cổng có thể được chia thành RowDataGateway hoặc TableGateway, tùy thuộc vào việc bạn vượt qua "id" hay "object". Cổng thường được so sánh với bản ghi hoạt động. Nó liên kết mô hình miền của bạn với lược đồ cơ sở dữ liệu.

    Kho lưu trữ / DataMapper / DAO : Chúng là cùng một thứ. Tất cả đều đề cập đến lớp Persistence chuyển các thực thể cơ sở dữ liệu sang mô hình miền. Không giống như cổng, Kho lưu trữ / DataMapper / DAO ẩn việc thực hiện. Bạn không biết nếu có PersonGateway đằng sau Person. Nó có thể, hoặc có thể không, bạn không quan tâm. Tất cả những gì bạn biết là nó phải có các thao tác CRUD được hỗ trợ cho từng đối tượng miền. Nó tách rời nguồn dữ liệu và mô hình miề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.