Cách tiếp cận nào trong Mô hình DataMapper tốt hơn cho nhiều bảng hoặc đã tham gia?


8

Thông thường, Data Mapper ánh xạ dữ liệu của một bảng cụ thể. (Về mặt lý thuyết, nó nên liên lạc giữa Storage và Object Object, nhưng trong trường hợp của tôi thì không thể thực hiện được, vì vậy tôi đang liên lạc trực tiếp với các bảng.)

Bảng1Mappper> Bảng1

Nhưng nếu bảng đó yêu cầu dữ liệu được nối từ một bảng khác, thì bạn đang mở rộng phạm vi của Trình ánh xạ dữ liệu của mình, điều này chỉ giả sử ánh xạ từ một bảng.

Table1Mapper> Table1: bên trong tham gia: Table2

Sẽ không tốt hơn nếu Bảng2 có trình Table2Mapperánh xạ riêng để ánh xạ dữ liệu của nó?

Nếu bạn nghĩ Yes, sau đó nếu bạn muốn hiển thị danh sách các bản ghi từ Table1Mapper và sau đó sử dụng Table2Mapper để có được những dữ liệu được cho là được nối, Bạn sẽ chạy một truy vấn trong một vòng lặp, điều này cũng không tốt.

Bạn hiểu gì về cách này?


Một cách khác là thay đổi mapper của bạn để xử lý các bảng phụ?

class Table1Mapper {
    public main_table = 'table1';
    public sub_table1 = 'table2';
}

Mà tôi nghĩ là ổn, nhưng chỉ cho đến khi phạm vi của toàn bộ trình ánh xạ xử lý một thực thể cụ thể trong ứng dụng. Ví dụ postpost_author. Nhưng nếu phạm vi khác nhau như postgallery, ở trên sẽ không cung cấp một trình ánh xạ dữ liệu lý tưởng. Để minh họa điều này

class PostMapper {
     public table_name = 'tbl_post';
     public gallery_table_name = 'tbl_gallery';
}

Có đúng không? Tuy nhiên, tuy nhiên, bạn sẽ muốn lấy các phòng trưng bày của một bài đăng trong một truy vấn, bởi vì thêm một chi phí truy vấn trong một vòng lặp không phải là một hiệu suất giải pháp tốt.

Bạn nghĩ gì là cách đúng đắn để giải quyết vấn đề này trong Mẫu DataMapper / hoặc bất kỳ mẫu nào khác nếu nó có cách xử lý tốt hơn các trường hợp như vậy?

Câu trả lời:


5

Theo Data Mapper, bạn có nghĩa là một mô tả của Martin Fowler , phải không? Đây là một trong những mẫu mô hình kiến ​​trúc nguồn dữ liệu. Những thứ khác là:

Data Mapper khác với các mẫu khác liên quan đến mối quan hệ giữa các đối tượng và bảng. Cả hai mẫu Cổng dữ liệu và mẫu Bản ghi hoạt động đều giả định gần như một ánh xạ từ bảng sang đối tượng.

Hãy xem một ví dụ:

table BANK_ACCOUNT
   ID

table BANK_ACCOUNT_BALANCE
   ID
   BANK_ACCOUNT_ID
   BALANCE_AMOUNT
   DATE

Các đối tượng miền là:

class BankAccount {
    long id;
}

class BankAccountBalance {
    long id;
    long bankAccountId;
    Decimal balanceAmount;
    Date date;
}

Như bạn thấy ánh xạ một đến một giữa các lớp và bảng. Ngoài ra còn có hai Cổng dữ liệu Bảng / Hàng hoặc Bản ghi hoạt động khác nhau - một cho mỗi bảng.

Ngược lại, dữ liệu Mapper cho phép gián tiếp :

Một lớp Mappers (473) di 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, khi bạn đang sử dụng Data Mapper, các đối tượng của bạn có thể khác với các bảng cơ sở dữ liệu. Bạn được tự do giới thiệu tập hợp, tham gia với các bảng khác, thực hiện các phép toán số học, giới thiệu hệ thống phân cấp thừa kế. Vì vậy, trả lời câu hỏi của bạn - hoàn toàn ổn khi tham gia hai bảng trong Data Mapper miễn là đối tượng kết quả là đối tượng miền hợp lệ.

Trong ví dụ của chúng tôi, chúng tôi có thể có:

class BankAccount {
    long id;
    Decimal latestBalance;
    Date latestBalanceDate;
}

dưới dạng đối tượng miền được trả về bởi Data Mapper duy nhất dựa trên THAM GIA và tổng hợp.

Do đó, Data Mapper là hoàn hảo để đại diện cho mô hình miền không tầm thường. Nếu mô hình miền của bạn khá đơn giản, bạn có thể cân nhắc sử dụng mẫu Bản ghi hoạt động hoặc Cổng dữ liệu.

Need for THAM GIA Data Mapper đôi khi có thể (nhưng không phải) chỉ ra rằng lớp miền quá phức tạp. Vui lòng kiểm tra Nguyên tắc trách nhiệm đơn , Nguyên tắc phân chia giao diện .

Trong các lớp miền Thiết kế hướng tên miền (tức là được trả về bởi Data Mapper) có dạng các thực thể hoặc các đối tượng giá trị. Cuốn sách DDD mô tả khá tốt những gì một thực thể nên bao gồm. Bạn có thể muốn kiểm tra điều này.

Ngoài ra DDD định nghĩa Uẩn (được mô tả khá tốt ở đây ). Chúng thường được tải cùng nhau. Tham gia hai bảng có thể gợi ý rằng có hai thực thể trong tổng hợp đơn.


Cảm ơn. Mối quan tâm duy nhất của tôi là các bảng khác nhau mặc dù có liên quan với nhau có thể có Mapper cá nhân duy trì chúng. Nếu một người lập bản đồ khác thực hiện một phần của việc này vì dữ liệu có liên quan, thì logic duy trì hoặc trừu tượng hóa dữ liệu của liên quan được phân tách giữa hai người lập bản đồ. Đây là những gì cảm thấy như "Điều này có thể được thực hiện theo cách tốt hơn" cảm thấy bên trong.
Starx
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.