2012-01-01 36 views
8

Nói một cách đơn giản về triển khai thực hiện cổng dữ liệu bảng (TDG): bạn tạo lớp TDG riêng biệt chứa SQL cho các hoạt động CRUD với bảng cụ thể. Vì vậy, các mô hình của bạn giao tiếp không trực tiếp với nguồn dữ liệu (ví dụ như cơ sở dữ liệu), nhưng thông qua các mô hình trừu tượng đó - các lớp TDG. Vì vậy, nó chỉ là một cách tiếp cận để làm cho một mức độ trừu tượng và nó chỉ là một wrapper để giao tiếp với cơ sở dữ liệu - nhận và sửa đổi dữ liệu. Các lớp TDHO IMHO không được chứa các thành viên, chỉ có các phương thức. Dưới đây là một lược đồ tốt để hình dung việc sử dụng TDG pattern. Khi sử dụng phương pháp TDG, SQL nên được chuyển từ các lớp mô hình sang các lớp nguồn dữ liệu (TDG). Và tất cả các dữ liệu mà tôi lấy từ DB thông qua các lớp TDG được lưu trữ trong các thành viên mô hình của tôi.Làm cách nào để triển khai Cổng Dữ liệu Bảng khác với Bản ghi Hoạt động?

Bây giờ, việc triển khai bản ghi đang hoạt động thì sao? Nếu tôi sẽ hợp nhất truy cập dữ liệu và lớp mô hình của tôi vào một lớp mô hình sau đó tôi sẽ thực hiện hồ sơ hoạt động? Tôi đã không thể tìm thấy một sự phân biệt rõ ràng hoặc làm thế nào những mô hình tìm trong PHP và khác nhau.

Thông thường, tôi có một lớp cơ sở dữ liệu singleton và sau đó tách lớp mô hình cho từng bảng cơ sở dữ liệu. Mỗi lớp mô hình có CRUD + một số hoạt động (đếm, avg và vv) tùy chỉnh. Một số lớp học có các thành viên để duy trì kết quả từ CRUD hoặc các hoạt động tùy chỉnh - điều đó được thực hiện khi cần. Cách tiếp cận này có thể được xác định là bản ghi hoạt động không? Ngoài ra, nếu tôi sẽ di chuyển SQL từ các lớp mô hình của tôi đến các lớp TDG thì đây có phải là Table Data Gateway không?

Trả lời

14

Từ http://martinfowler.com/eaaCatalog/index.html

Bảng liệu Gateway: Một đối tượng mà hoạt động như một Gateway (466) vào một bảng cơ sở dữ liệu. Một cá thể xử lý tất cả các hàng trong bảng.

enter image description here

Active Record: Một đối tượng bọc lấy một hàng trong một bảng cơ sở dữ liệu hoặc xem, gói gọn các truy cập cơ sở dữ liệu, và cho biết thêm lý tên miền trên dữ liệu đó.

enter image description here

Sự khác biệt chính rõ ràng được rằng TDGs quấn quyền truy cập vào một bảng và chỉ trả về dữ liệu liên tiếp, trong khi Ars quấn quyền truy cập vào một hàng trong bảng thêm logic kinh doanh để nó.

Trừ khi bạn có trở kháng không phù hợp rất thấp, có TDG được ưu tiên vì AR đối tượng kinh doanh/tên miền của bạn tuân theo cấu trúc trong cơ sở dữ liệu, chúng tôi thường không mô hình hóa đối tượng tên miền của bạn. Một hàng có thể biết làm thế nào để duy trì chính nó, nhưng một người không nên biết. Nó có thể duy trì lâu dài hơn để tách biệt logic tồn tại và logic miền.

Về đối tượng Singleton DB của bạn, hãy xem Is there a use-case for singletons with database access in PHP?.

+0

Cảm ơn. Những loại phương thức nào (và các truy vấn SQL) mà tôi có thể có khi triển khai TDG? Tôi không nên đặt logic kinh doanh nhưng những gì có thể được coi là một công cụ logic kinh doanh? Ví dụ, tôi có thể có phương pháp như vậy (và truy vấn SQL) trong các lớp TDG như selectAllRows, cập nhật hàng loạt (vượt qua một mảng dữ liệu), selectAllPersonsByLastName, countAll, SelectAvg và vv? IMHO tất cả trong số họ nên cư trú trong lớp TDG. Công cụ logic nghiệp vụ có nghĩa là bất kỳ phép tính bổ sung nào được thực hiện từ tập kết quả SQL có nguồn gốc từ lớp TDG không? – Centurion

+0

@Centurion TDG có thể chứa tất cả các truy vấn SQL liên quan đến bảng: chèn, cập nhật, chọn (logic lưu giữ lâu dài).Nó không nên chứa mã xử lý các kết quả truy vấn (logic nghiệp vụ). Đặt điều đó vào [Mô hình miền] (http://martinfowler.com/eaaCatalog/domainModel.html) hoặc [Bảng mô-đun] (http://martinfowler.com/eaaCatalog/tableModule.html) – Gordon

+0

Có ý tưởng:) nhưng tôi có thêm một câu hỏi nữa. Một lớp mô-đun bảng ánh xạ tới một bảng, vì vậy IMHO lớp mô-đun bảng như vậy có thể được coi là một mô hình (khi nói trong bối cảnh MVC)? Điều gì về mô hình miền, những gì nên được coi là một mô hình sau đó? Một nhóm các lớp được sử dụng cho bộ điều khiển cụ thể? – Centurion

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