2010-02-04 25 views
6

Tôi đã có một ứng dụng MVC được viết bằng Zend Framework để lấy dữ liệu từ cơ sở dữ liệu Oracle 10g và hiển thị dữ liệu này trong Bảng và Danh sách và làm phong phú thêm dữ liệu này thông qua màu sắc và biểu đồ. Không có ORM và không tạo, cập nhật hoặc xóa liên quan, chỉ đọc thuần túy. Dữ liệu được chèn từ một ứng dụng khác. Dữ liệu trong DB được mô hình hóa sau khi các khái niệm mà chúng đại diện và truy cập bởi Chế độ xem DB tổng hợp dữ liệu này từ các bảng khác nhau (kế thừa, không thể thay đổi), ví dụ:Bạn sẽ mô hình hóa ứng dụng này như thế nào?

| Event ID | Start    | End     | Status | Created_By | 
----------------------------------------------------------------------------- 
| 12345678 | 2009-10-01 12:00:00 | 2009-10-01 12:15:00 | booked | John Doe | 
| 12345679 | 2009-11-01 13:00:00 | 2009-12-01 12:00:00 | booked | John Doe | 
| 12345680 | 2009-11-01 13:00:00 | 2009-12-01 12:00:00 | tba | Jane Doe | 

Người dùng có thể ảnh hưởng đến hiển thị cột, sắp xếp và sắp xếp từ Chế độ xem. Khách hàng có thể từ chối/cho phép truy cập vào các cột và giới hạn nội dung cột thành các giá trị nhất định. Người dùng không thể ghi đè cài đặt ứng dụng khách. Một người dùng là một diễn viên, trong khi một khách hàng về cơ bản chỉ là một bộ lọc tạo ra một tập con của dữ liệu sẵn có cho một người dùng thuộc về máy khách. Cài đặt người dùng và ứng dụng khách được duy trì.

cách tiếp cận hiện tại của tôi làm việc gần như thế này:

Request --> Controller 
      | <--> sanitizes and returns Request params 
      | ---> Facade (capsules steps to fetch View Data) 
      |  | <--> Table Data Gateway builds Query for requested View 
      |  | <--> Query Decorator¹ applies User/Client settings 
      |  | <--> DB Adapter fetches RecordSet from decorated Query 
      | <----returns Recordset 
      | <--> applies RecordSet to View 
      | <--> Data-Aware ViewHelper render RecordSet (and View) 
Response <--returns rendered View 

¹Các Query Decorator có thể đọc trong thư mục/Cài đặt khách hàng tài khoản tiếp tục tồn tại và thêm nó vào các đối tượng truy vấn cơ bản được trả về bởi các TDG khi đang bay.

Tuy nhiên, gần đây tôi đã nghi ngờ cách tiếp cận này và muốn cải thiện nó. Tôi đoán tôi có thể loại bỏ hoàn toàn TDG và làm cho tòa nhà View hoàn toàn giống với giao diện người dùng; chỉ dựa trên cấu trúc DB. Người dùng chắc chắn sẽ thích điều này. Vấn đề là, View phải biết rất nhiều về dữ liệu. Các ViewHelpers phải biết tên cột để làm giàu dữ liệu và thường họ làm như vậy liên quan đến nhiều cột trong Recordsets. Họ không thể là chung chung và một cái gì đó nói với tôi điều này là rắc rối anyway. Nó cảm thấy như mishmash. Tôi chỉ không thể xác định tại sao.

Bất kỳ mẫu, ý tưởng - và ý kiến ​​nào - được đánh giá cao. Tôi biết câu hỏi có phần mơ hồ, nhưng như tôi đã nói, tôi không thể xác định điều gì khiến tôi nghi ngờ cách tiếp cận này. Vì vậy, tôi đoán tôi đang tìm kiếm bất kỳ phương pháp tiếp cận thực hành tốt để xây dựng ứng dụng trung tâm cơ sở dữ liệu tùy biến người dùng và khách hàng một cách duy trì. Tôi chắc chắn không cần một giải pháp, chỉ cần một số ý tưởng và có thể là một vài liên kết để xem cách những người khác tiếp cận vấn đề này, vì vậy tôi có thể đưa nó vào tài khoản về việc tái cấu trúc tiếp theo.

Lưu ý
Tôi sẽ để câu hỏi mở trong suốt thời gian trước khi chấp nhận câu trả lời. Bất kỳ đầu vào nào được đánh giá cao.

+1

Hãy tha thứ cho sự hoài nghi của tôi, nhưng: Quan điểm cần biết nhiều về dữ liệu? Các ViewHelpers phải biết tên cột? * Tại sao? * Điều này gần giống như một hiệu ứng Inner-Platform, một sự sáng tạo của Microsoft Access hoặc Cognos. Tùy biến vượt quá một ngưỡng nhất định là điều ác; nó có thể là * yêu cầu * cần tái cấu trúc. – Aaronaught

+0

@Aaronaught Skepticism là tốt. Đó là điều khiến tôi hỏi câu hỏi này :) Để trả lời câu hỏi của bạn: hãy tưởng tượng có một ViewHelper sẽ hiển thị thanh thời gian dựa trên * Start *, * End * và * Status * như một phần của bảng hiển thị toàn bộ Recordset ngoài ViewHelper biểu diễn một PieChart dựa trên * Created_By *. – Gordon

Trả lời

13

Sau khi đọc câu hỏi của bạn một vài lần và suy niệm về nó cho một chút, tôi tin rằng tôi sẽ tổng hợp tình hình thusly:

Các "M" là mất tích từ bạn "MVC".

Tại thời điểm này, bạn đã tạo thủ công lược đồ cơ sở dữ liệu quan hệ sao cho nó có ánh xạ 1: 1 với mô hình miền của bạn. Và điều đó thật tuyệt, nó làm cho việc ánh xạ trở nên rất dễ dàng, nhưng một recordset vẫn không phải là một lớp miền.

Thuật ngữ Mẫu trong bối cảnh MVC đề cập đến một mô hình miền, không phải là một quan hệ mô hình. Nếu bạn có một cơ sở dữ liệu quan hệ sao lưu ứng dụng này, thì bạn cần một số loại ánh xạ. Điều đó không có nghĩa là bạn cần một khung công tác ORM chính thức như Doctrine - mặc dù tôi thấy rằng những công cụ này làm cho cuộc sống của tôi dễ dàng hơn nhiều, ngay cả đối với các dự án nhỏ - nhưng bạn cần một cái gì đó. Trong thực tế, khung công tác Zend thậm chí đi sâu vào chi tiết về việc ánh xạ một mô hình miền trong Quick Start.

Tôi không nghĩ rằng bạn cần phải loại bỏ TDG. Tóm tắt là tốt. Ripping nó ra để làm cho ứng dụng của bạn một chút leaner là cái gì tôi sẽ so sánh để đi vào một tòa nhà văn phòng và tách hệ thống điện thoại trên cơ sở mà nhân viên chỉ có thể sử dụng điện thoại di động của họ. Họ có thể, nhưng bạn không muốn họ, giống như cách bạn không muốn lượt xem của mình ném truy vấn SQL trực tiếp vào cơ sở dữ liệu. Nó không hiệu quả và thường khó quản lý.

phiên bản của tôi về kiến ​​trúc sẽ trông như thế này:

Request --> Controller 
      | <--> sanitizes and returns Request params 
      | ---> Facade (encapsulates steps to fetch View Data) 
      |  | <--> Table Data Gateway builds Query for requested View 
      |  | <--> Query Decorator applies User/Client settings 
      |  | <--> DB Adapter fetches RecordSet from decorated Query 
***   |  | <--> Mapping layer converts RecordSet to Domain Model 
***   | <----returns Model 
***   | <--> applies Model to View 
***   | <--> Data-Aware ViewHelper render Model (and View) 
Response <--returns rendered View 

Tôi đã đánh dấu các dòng thay đổi với ***. Thực sự, điều duy nhất tôi thay đổi là thay vì chọn một bản ghi từ mặt tiền, nó sẽ chọn một mô hình (có thể là một loạt các lớp miền) và áp dụng cho Chế độ xem.

Thay vì các cụm từ như $row['Status'] trong [Trình trợ giúp] của bạn, bạn sẽ có $event->status, an toàn hơn và đơn giản hơn để duy trì trong thời gian dài. Không có tên cột trong đó, chỉ là một thuộc tính.

Bây giờ bạn đã đề cập rõ ràng ở đầu câu hỏi của bạn rằng bạn không có bất kỳ ORM nào, vì vậy tôi nghĩ bạn có thể biết hầu hết điều này và có thể chỉ cần thúc đẩy. Những nghi ngờ dai dẳng trong tâm trí của bạn có lẽ nằm dọc theo dòng: Điều gì xảy ra nếu nó không phải lúc nào cũng chỉ đọc? Điều gì sẽ xảy ra nếu mô hình dữ liệu trở nên phức tạp hơn? Điều gì sẽ xảy ra nếu mọi người bắt đầu yêu cầu báo cáo phức tạp hơn?

Tất cả những điều này là lý do tại sao bạn có một mô hình miền, tại sao nó trên thực tế các khối xây dựng cơ bản của MVC: Cuối cùng, mô hình tinh thần người dùng của bạn có sẽ mùa thu không đồng bộ với mô hình dữ liệu, vì một số lý do mà tôi sẽ không nhận được ở đây. Vấn đề là, nó hầu như luôn luôn xảy ra.

Tôi có chắc chắn rằng điều này là cần thiết không? Tôi có tích cực rằng nó không chỉ là quá mức cần thiết, một loạt các câu thần chú nghi lễ không có ý nghĩa đối với một dự án nhỏ như vậy?

Không, tôi không có. Chỉ bạn mới có thể quyết định điều đó. Điều tôi có thể cho bạn biết rằng mô hình MVC là kiến ​​trúc cụ thể không hoạt động tốt cho bạn mà không có mô hình miền phù hợp. Đó là một chút tốt hơn, nhưng không phải là rằng tốt hơn nhiều so với chỉ có các truy vấn nội tuyến hoặc các cuộc gọi mặt tiền trong mỗi trang. Nếu không có một mô hình, MVC không nhiều hơn một chương trình viết lại URL ưa thích.

Có thể bạn cần mức trừu tượng này, có thể bạn không; nhưng tôi đoán rằng bạn có thể nghi ngờ bạn có thể, nếu không bạn sẽ không hỏi câu hỏi. Nghĩ về nó, phân tích các yêu cầu và phạm vi hiện tại, hãy tự hỏi những loại thay đổi có thể là gì, và nếu kiến ​​trúc hiện tại có vẻ quá giòn để thích ứng, thì bước logic tiếp theo sẽ là một mô hình miền - ngay cả khi hôm nay một tấm gương chính xác của mô hình quan hệ. Ngày mai nó có thể không được.

Hy vọng rằng đây là loại câu trả lời bạn đang tìm kiếm!

+0

Cảm ơn Aaron. Trên thực tế, bạn khá chính xác về những nghi ngờ của tôi. Tôi muốn có một ORM và một Mô hình miền ngay từ đầu vì những lý do bạn đã đề cập, nhưng đã được nói ra bởi nó bởi cấp trên bởi vì anh ta lo ngại về tác động hiệu suất mà nó sẽ có. – Gordon

+0

@Gordon: Ahh, quản lý vi mô, bây giờ tất cả đều có ý nghĩa! Trừ khi trang web của bạn giao dịch với hàng triệu người dùng mỗi ngày, trừu tượng tốt và thiết kế tốt phải là ưu tiên quan trọng hơn hiệu suất (và thậm chí sau đó, có các tùy chọn khác). Tác động hiệu suất của một mô hình miền gần như là không; hầu hết các ứng dụng dựa trên cơ sở dữ liệu được I/O ràng buộc và dành phần lớn thời gian của họ chờ kết quả truy vấn. Chúc may mắn! – Aaronaught

+0

Cảm ơn bạn lần nữa. Thưởng thức tiền thưởng kiếm được của bạn :) – Gordon

0

Thiết kế lược đồ DB có các yêu cầu khác nhau (hiệu năng truy vấn/ghi, khả năng mở rộng) làm giao diện người dùng đẹp (luồng trang tốt, hỗ trợ cách thức hoạt động của mọi người hoặc cách hoạt động của quy trình). Khá thường xuyên do đó cách tiếp cận giao diện người dùng và DB rất khó để ánh xạ trực tiếp.

Ví dụ xấu Tôi nhớ một ứng dụng sử dụng 'Biểu mẫu Oracle', đã trực tiếp trình bày một chế độ xem chung từ cấu trúc cơ sở dữ liệu. Đối với những người không phải công nghệ, nó thường rất phản trực giác để sử dụng. Tuy nhiên, tôi nghĩ trong trường hợp của bạn, nếu View có thể được ánh xạ trực tiếp tới lược đồ DB, hãy loại bỏ các lớp trừu tượng không cần thiết, mã và đơn giản hóa hệ thống. Thực hiện các yêu cầu đơn giản như bạn có thể.

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