Thực hành tốt nhất hoặc các mẫu thiết kế để truy xuất dữ liệu để báo cáo và bảng điều khiển trong ứng dụng giàu miền


44

Đầu tiên, tôi muốn nói đây có vẻ là một câu hỏi / lĩnh vực bị bỏ quên, vì vậy nếu câu hỏi này cần cải thiện, hãy giúp tôi biến nó thành một câu hỏi tuyệt vời có thể mang lại lợi ích cho người khác! Tôi đang tìm kiếm lời khuyên và sự giúp đỡ từ những người đã thực hiện các giải pháp giải quyết vấn đề này, không chỉ là ý tưởng để thử.

Theo kinh nghiệm của tôi, có hai mặt của một ứng dụng - phía "tác vụ", phần lớn được điều khiển theo miền và là nơi người dùng tương tác phong phú với mô hình miền ("công cụ" của ứng dụng) và phía báo cáo, nơi người dùng lấy dữ liệu dựa trên những gì xảy ra ở phía nhiệm vụ.

Về mặt nhiệm vụ, rõ ràng một ứng dụng có mô hình miền phong phú nên có logic nghiệp vụ trong mô hình miền và cơ sở dữ liệu nên được sử dụng chủ yếu để duy trì. Tách biệt các mối quan tâm, mỗi cuốn sách được viết về nó, chúng tôi biết phải làm gì, tuyệt vời.

Còn phía báo cáo thì sao? Các kho dữ liệu có được chấp nhận hay chúng có thiết kế xấu vì chúng kết hợp logic kinh doanh trong cơ sở dữ liệu và chính dữ liệu đó? Để tổng hợp dữ liệu từ cơ sở dữ liệu thành dữ liệu kho dữ liệu, bạn phải áp dụng logic và quy tắc kinh doanh cho dữ liệu và logic và quy tắc đó không xuất phát từ mô hình miền của bạn, nó đến từ các quy trình tổng hợp dữ liệu của bạn. Là sai đó?

Tôi làm việc trên các ứng dụng quản lý dự án và tài chính lớn, nơi logic kinh doanh rộng khắp. Khi báo cáo về dữ liệu này, tôi thường sẽ có RẤT NHIỀU tập hợp để thực hiện để lấy thông tin cần thiết cho báo cáo / bảng điều khiển và các tập hợp có rất nhiều logic nghiệp vụ trong đó. Để thực hiện, tôi đã thực hiện nó với các bảng tổng hợp cao và các thủ tục được lưu trữ.

Ví dụ: giả sử cần có báo cáo / bảng điều khiển để hiển thị danh sách các dự án đang hoạt động (hãy tưởng tượng 10.000 dự án). Mỗi dự án sẽ cần một bộ số liệu được hiển thị cùng với nó, ví dụ:

  1. Tổng ngân sách
  2. nỗ lực cho đến nay
  3. tỷ lệ bỏng
  4. ngày cạn kiệt ngân sách ở mức hiện tại
  5. Vân vân.

Mỗi trong số này liên quan đến rất nhiều logic kinh doanh. Và tôi không chỉ nói về việc nhân số hoặc một số logic đơn giản. Tôi đang nói về để có được ngân sách, bạn phải áp dụng một bảng tỷ lệ với 500 mức giá khác nhau, một mức cho mỗi thời gian của nhân viên (trên một số dự án, các dự án khác có số nhân), áp dụng chi phí và bất kỳ đánh dấu thích hợp nào, v.v. logic là rộng rãi. Phải mất rất nhiều điều chỉnh tổng hợp và truy vấn để có được dữ liệu này trong một khoảng thời gian hợp lý cho khách hàng.

Điều này có nên được chạy qua tên miền đầu tiên? Hiệu suất thì sao? Ngay cả với các truy vấn SQL thẳng, tôi hầu như không nhận được dữ liệu này đủ nhanh để khách hàng hiển thị trong một khoảng thời gian hợp lý. Tôi không thể tưởng tượng việc cố gắng đưa dữ liệu này đến máy khách đủ nhanh nếu tôi đang bù nước cho tất cả các đối tượng miền này, trộn lẫn và kết hợp và tổng hợp dữ liệu của chúng trong lớp ứng dụng hoặc cố gắng tổng hợp dữ liệu trong ứng dụng.

Có vẻ như trong các trường hợp này, SQL rất giỏi trong việc bẻ khóa dữ liệu và tại sao không sử dụng nó? Nhưng sau đó bạn có logic kinh doanh bên ngoài mô hình miền của bạn. Mọi thay đổi đối với logic nghiệp vụ sẽ phải được thay đổi trong mô hình miền và các sơ đồ tổng hợp báo cáo của bạn.

Tôi thực sự không biết cách thiết kế phần báo cáo / bảng điều khiển của bất kỳ ứng dụng nào liên quan đến thiết kế hướng tên miền và các thông lệ tốt.

Tôi đã thêm thẻ MVC vì MVC là hương vị thiết kế và tôi đang sử dụng nó trong thiết kế hiện tại của mình, nhưng không thể hiểu làm thế nào dữ liệu báo cáo phù hợp với loại ứng dụng này.

Tôi đang tìm kiếm bất kỳ trợ giúp trong lĩnh vực này - sách, mẫu thiết kế, từ khóa cho google, bài viết, bất cứ điều gì. Tôi không thể tìm thấy bất kỳ thông tin về chủ đề này.

EDIT VÀ VÍ DỤ KHÁC

Một ví dụ hoàn hảo khác mà tôi đã chạy qua ngày hôm nay. Khách hàng muốn báo cáo cho Nhóm bán hàng của khách hàng. Họ muốn những gì có vẻ như là một số liệu đơn giản:

Đối với mỗi nhân viên bán hàng, doanh số hàng năm của họ là gì?

Nhưng điều đó thật phức tạp. Mỗi người bán hàng tham gia vào nhiều cơ hội bán hàng. Một số họ đã thắng, một số thì không. Trong mỗi cơ hội bán hàng, có nhiều nhân viên bán hàng, mỗi người được phân bổ một tỷ lệ tín dụng cho việc bán hàng theo vai trò và sự tham gia của họ. Vì vậy, bây giờ hãy tưởng tượng đi qua miền cho việc này ... lượng bù nước đối tượng bạn sẽ phải làm để lấy dữ liệu này từ cơ sở dữ liệu cho mỗi nhân viên Bán hàng:

Nhận tất cả SalesPeople->
Đối với mỗi người nhận được SalesOpportunities->
Đối với mỗi người, hãy lấy phần trăm doanh số của họ và tính số tiền Bán hàng của họ
sau đó Cộng tất cả SalesOpportunitysố tiền Bán hàng của họ .

Và đó là MỘT số liệu. Hoặc bạn có thể viết một truy vấn SQL có thể thực hiện nhanh chóng và hiệu quả và điều chỉnh nó nhanh.

EDIT 2 - Mẫu CQRS

Tôi đã đọc về Mẫu CQRS và, trong khi hấp dẫn, ngay cả Martin Fowler cũng nói rằng nó chưa được thử nghiệm. Vì vậy, làm thế nào có vấn đề này đã được giải quyết trong quá khứ. Điều này phải được mọi người đối mặt vào lúc này hay lúc khác. Một cách tiếp cận được thiết lập hoặc mòn với một hồ sơ thành công là gì?

Chỉnh sửa 3 - Hệ thống / Công cụ báo cáo

Một điều khác cần xem xét trong bối cảnh này là các công cụ báo cáo. Dịch vụ báo cáo / Báo cáo pha lê, Dịch vụ phân tích và Cognoscenti, v.v ... tất cả đều mong đợi dữ liệu từ SQL / cơ sở dữ liệu. Tôi nghi ngờ dữ liệu của bạn sẽ thông qua doanh nghiệp của bạn sau này cho những điều này. Tuy nhiên, họ và những người khác giống như họ là một phần quan trọng của báo cáo trong rất nhiều hệ thống lớn. Làm thế nào là dữ liệu cho những dữ liệu này được xử lý đúng cách khi có ngay cả logic kinh doanh trong nguồn dữ liệu cho các hệ thống này cũng như có thể trong chính các báo cáo?



3
Xin lỗi đã không có ý. Các mod bảo tôi đăng lại ở đây, nhưng sau đó rõ ràng là có thể di chuyển cùng một câu hỏi để tôi có hai. Xin lỗi vì điều đó.
Richard

Tôi bối rối. Không ai làm điều này? Không ai phải đối mặt với vấn đề này?
Richard

Không phải là 'tách biệt mối quan tâm' nhiệm vụ / báo cáo của bạn về mặt lý thuyết một chút sao? Bạn có thể nói bên báo cáo cũng có các quy tắc kinh doanh, vì vậy bạn không thể tránh đưa logic kinh doanh vào toàn bộ chuỗi. Dù bạn sử dụng công cụ BI nào, bạn sẽ phải tạo kết quả trung gian từ các tác vụ đầu vào đến giai đoạn báo cáo (xác định các đối tượng tổng hợp, v.v.). Sau đó, nó sôi sùng sục đến câu hỏi giòn ở đâu. Có lẽ bạn có thể tiếp cận vấn đề với một piramid (với phần trên bị cắt) hoặc ẩn dụ phễu.
Jan Doggen

@JanDoggen Đó chính xác là quan điểm của tôi. Công cụ BI sẽ CÓ logic BL trong đó. Bây giờ tôi đang sao chép BL nằm trong miền phong phú của sản phẩm phần mềm của tôi. Ổn chứ?
Richard

Câu trả lời:


16

Đây là một câu trả lời rất hay, nhưng đi thẳng vào trọng tâm của vấn đề:

Về mặt DDD có thể nghĩ về việc báo cáo như là một Bối cảnh bị ràng buộc?, Vì vậy thay vì suy nghĩ theo mô hình miền "THE", bạn nên sẵn sàng nghĩ rằng có nhiều hơn một mô hình. Vì vậy, có ổn nếu miền báo cáo có logic báo cáo kinh doanh trong đó, cũng như miền miền giao dịch có logic kinh doanh giao dịch trong đó.

Đối với câu hỏi, giả sử các thủ tục được lưu trữ SQL so với mô hình miền trong mã ứng dụng, các ưu và nhược điểm tương tự áp dụng cho hệ thống báo cáo như đối với hệ thống giao dịch.

Vì tôi thấy rằng bạn đã thêm tiền thưởng cho câu hỏi, tôi đã đọc lại câu hỏi và nhận thấy rằng bạn đang yêu cầu tài nguyên cụ thể về vấn đề này, vì vậy tôi nghĩ rằng tôi nên bắt đầu bằng cách đề nghị bạn xem xét các câu hỏi khác về Stack Overflow về vấn đề này, và tôi đã tìm thấy cái này https://stackoverflow.com/questions/11554231/how-does-domain-driven-design-handle-reporting

Ý chính chung của vấn đề đó là sử dụng CQRS làm mẫu cho hệ thống của bạn, phù hợp với DDD và dựa vào trách nhiệm của bên truy vấn như một cách để báo cáo được thực hiện, nhưng tôi không chắc đó là câu trả lời hữu ích trong trường hợp của bạn.

Tôi cũng tìm thấy http://www.martinfowler.com/bliki/ReportingDatabase.html , mà tôi tìm thấy được liên kết từ đây: http://groups.yahoo.com/neo/groups/domaindrivendesign/conversations/topics/2261

Đây là một bài viết thú vị từ ACM về vấn đề này: http://dl.acm.org/citation.cfm?id=2064685 nhưng nó nằm sau một tường thành nên tôi thực sự không thể đọc nó (không phải là thành viên ACM :().

Ngoài ra còn có câu trả lời ở đây cho một câu hỏi tương tự: https://stackoverflow.com/questions/3380431/cqrs-ddd-synching-reporting-database

và cái này: http://snape.me/2013/05/03/appending-domain-driven-design-to-data-warehouses/

Hi vọng điêu nay co ich!


Xin chào @RibaldEddie. Cảm ơn vi đa trả lơi. Có vẻ như không thích tôi. Vì vậy, bạn đang nói rằng bạn có thể coi các thủ tục được lưu trữ là lớp miền cho Bối cảnh báo cáo không?
Richard

Nếu bạn có lý do chính đáng để làm điều đó trong tình huống của mình thì điều đó tốt. Cá nhân tôi không chắc chắn rằng tôi sẽ sử dụng SP trong mọi trường hợp ngoại trừ có thể để xác thực dữ liệu hoặc dọn dẹp, nếu không tôi sẽ có xu hướng né tránh điều đó trong mọi trường hợp.
RibaldEddie

4

Tôi hiểu từ câu hỏi của bạn là: Ứng dụng cho công việc hàng ngày có

Xem >> Bộ điều khiển >> Mô hình (BL) >> Cơ sở dữ liệu (Dữ liệu)

Ứng dụng cho mục đích báo cáo

Xem >> Bộ điều khiển >> Mô hình >> Cơ sở dữ liệu (Dữ liệu + BL)

Vì vậy, thay đổi trong BL cho ' ứng dụng tác vụ ' cũng sẽ dẫn đến thay đổi trong ' báo cáo ' BL. Đó là vấn đề thực sự của bạn phải không? Vâng, đó là OK để thay đổi hai lần, đó là nỗi đau mà bạn phải chịu. Lý do là cả hai BL được phân tách bởi mối quan tâm tương ứng của họ. Một là để tìm nạp dữ liệu và một để tổng hợp dữ liệu. Ngoài ra, BL ban đầu và BL tổng hợp của bạn sẽ được viết bằng công nghệ hoặc ngôn ngữ khác nhau ( C # / java và SQL Proc ). Không có lối thoát cho nó.

Hãy lấy một ví dụ khác không liên quan đến báo cáo cụ thể. Giả sử một công ty XXX theo dõi thư của tất cả người dùng để giải thích và bán thông tin đó cho các công ty tiếp thị. Bây giờ nó sẽ có một BL để giải thích và một BL để tổng hợp dữ liệu cho các công ty tiếp thị. Mối quan tâm là khác nhau cho cả BL. Ngày mai nếu BL của họ thay đổi sao cho các thư đến từ Cuba nên bị bỏ qua, thì logic kinh doanh sẽ được thay đổi ở cả hai phía.


3

Báo cáo là một bối cảnh bị ràng buộc, hoặc một tên miền phụ, để nói một cách lỏng lẻo. Nó giải quyết nhu cầu kinh doanh thu thập / tổng hợp dữ liệu và xử lý dữ liệu để đạt được thông tin kinh doanh.

Cách bạn triển khai tên miền phụ này có thể sẽ là sự cân bằng giữa (hầu hết) cách chính xác về mặt kiến ​​trúc mà bạn có thể làm điều này và cơ sở hạ tầng của bạn sẽ cho phép. Tôi thích bắt đầu ở phía trước, và chỉ tiến về phía sau khi cần thiết.

Bạn có thể chia vấn đề này thành hai vấn đề chính mà bạn đang giải quyết:

  1. Tổng hợp, hoặc lưu trữ dữ liệu. Điều này sẽ xử lý một số nguồn dữ liệu và kết hợp thông tin theo cách mà nó được lưu trữ trong một nguồn dữ liệu khác.

  2. Truy vấn nguồn dữ liệu tổng hợp để cung cấp thông tin kinh doanh.

Không có vấn đề nào tham khảo bất kỳ cơ sở dữ liệu cụ thể hoặc công cụ lưu trữ. Lớp miền của bạn chỉ nên xử lý các giao diện, được triển khai trong lớp cơ sở hạ tầng của bạn bằng các bộ điều hợp lưu trữ khác nhau.

Bạn có thể có nhiều công nhân khác nhau hoặc một số công việc được lên lịch, được chia thành một vài phần chuyển động:

  • Một cái gì đó để truy vấn
  • Một cái gì đó để tổng hợp
  • Một cái gì đó để lưu trữ

Hy vọng rằng bạn có thể thấy một số CQRS tỏa sáng ở đó.

Về phía báo cáo, chỉ cần thực hiện truy vấn, nhưng không bao giờ trực tiếp vào cơ sở dữ liệu. Đi qua các giao diện của bạn và thông qua lớp miền của bạn ở đây. Đây không phải là miền vấn đề giống như các nhiệm vụ chính của bạn, nhưng vẫn cần có một số logic ở đây mà bạn muốn tuân thủ.

Ngay khi bạn truy cập trực tiếp vào cơ sở dữ liệu, bạn phụ thuộc vào nó nhiều hơn và cuối cùng nó có thể can thiệp vào nhu cầu dữ liệu của ứng dụng gốc của bạn.

Ngoài ra, ít nhất là đối với tôi, tôi chắc chắn thích viết các bài kiểm tra và phát triển mã hơn là các truy vấn hoặc các thủ tục được lưu trữ. Tôi cũng thích không khóa mình vào các công cụ cụ thể cho đến khi thật cần thiết.


3

Việc truy xuất một lượng lớn thông tin trên các mạng diện rộng, bao gồm cả Internet, là vấn đề do các vấn đề phát sinh do độ trễ phản hồi, thiếu bộ nhớ truy cập trực tiếp vào tài nguyên phục vụ dữ liệu và khả năng chịu lỗi.

Câu hỏi này mô tả một mẫu thiết kế để giải quyết các vấn đề xử lý kết quả từ các truy vấn trả về lượng dữ liệu lớn. Thông thường, các truy vấn này sẽ được thực hiện bởi một quy trình khách trên một mạng diện rộng (hoặc Internet), với một hoặc nhiều tầng giữa, đến một cơ sở dữ liệu quan hệ cư trú trên một máy chủ từ xa.

Giải pháp liên quan đến việc thực hiện kết hợp các chiến lược truy xuất dữ liệu, bao gồm việc sử dụng các trình vòng lặp để duyệt qua các tập dữ liệu và cung cấp một mức độ trừu tượng thích hợp cho máy khách, đệm hai tập hợp dữ liệu, truy xuất dữ liệu đa luồng và cắt lát truy vấn.


Không chắc làm thế nào điều này liên quan đến câu hỏi của tôi hoặc làm thế nào nó nhận được 3 phiếu nhanh như vậy. Ngoài ra, bạn có nghĩa là bao gồm một liên kết ở đây?
Richard

2
Có vẻ như tiền thưởng đã được tự động trao cho câu trả lời này. Câu trả lời này có vẻ như vô nghĩa với tôi và tôi sẽ KHÔNG trao phần thưởng này.
Richard

2

Đó là điển hình để tách các cửa hàng dữ liệu hoạt động / giao dịch khỏi báo cáo. Loại thứ hai có thể có yêu cầu giữ dữ liệu vì lý do pháp lý (ví dụ: bảy năm dữ liệu tài chính để kiểm toán tài chính) và bạn không muốn tất cả dữ liệu đó trong kho dữ liệu giao dịch của mình.

Vì vậy, bạn sẽ phân vùng dữ liệu giao dịch của mình theo một số đo thời gian (hàng tuần, hàng tháng, hàng quý, hàng năm) và chuyển các phân vùng cũ hơn vào kho lưu trữ dữ liệu lịch sử / báo cáo của bạn thông qua ETL. Nó có thể hoặc không thể là kho dữ liệu với lược đồ sao và kích thước. Bạn sẽ sử dụng các công cụ báo cáo lưu trữ dữ liệu để thực hiện các truy vấn đặc biệt và cuộn lên và các công việc hàng loạt để tạo báo cáo định kỳ.

Tôi sẽ không đề xuất báo cáo chống lại cửa hàng dữ liệu giao dịch của bạn.

Nếu bạn thích nhấn vào đây, đây là những suy nghĩ nhiều hơn:

  1. "Tốt nhất" là chủ quan và những gì hoạt động.
  2. Tôi sẽ mua một sản phẩm báo cáo thay vì tự viết chúng.
  3. Nếu bạn đang sử dụng cơ sở dữ liệu quan hệ, thì SQL là trò chơi duy nhất trong thị trấn.
  4. Thủ tục lưu trữ phụ thuộc vào việc bạn có kỹ năng viết chúng hay không.

Phần mềm quản lý dự án mà bạn sử dụng trong nhà? Tôi sẽ mua trước khi xây dựng. Một cái gì đó giống như Rally và Microsoft Project.


Cảm ơn @duffymo. Dữ liệu này không chỉ được lưu trữ vì lý do pháp lý. Đó là hàng tấn dữ liệu được sử dụng và báo cáo thường xuyên. Công ty sống và chết bởi các báo cáo và bảng điều khiển. Đó là phần mềm quản lý dự án. Cách tốt nhất để cung cấp các báo cáo và bảng điều khiển này với dữ liệu là gì? Tổng hợp và kéo nó ra với SQL? Logic kinh doanh có trong Quy trình lưu trữ cho việc này không? Tất cả các câu hỏi của tôi vẫn chưa được trả lời!
giàu

Bạn có một câu trả lời - kho dữ liệu. Âm thanh như thế không phải là những gì bạn muốn nghe. Xem ở trên để chỉnh sửa.
duffymo

Vì vậy, nó là tốt cho logic kinh doanh trong miền được sao chép trong kho dữ liệu và dữ liệu? Ngoài ra, sau đó rút dữ liệu đó ra, tôi có sử dụng bất kỳ loại mô hình miền nào không? Hoặc chỉ cần kéo dữ liệu ra với các thủ tục được lưu trữ và hiển thị trong chế độ xem? Để giải quyết các điểm của bạn ở trên: Tôi không thể mua sản phẩm báo cáo ... lý do tôi viết đây là công ty có nhu cầu cụ thể không được đáp ứng bởi bất kỳ sản phẩm báo cáo nào. Tôi đang sử dụng một cơ sở dữ liệu quan hệ và có các kỹ năng SQL rất tốt. Nhưng tôi không muốn mặc định những gì tôi giỏi, tôi muốn làm những gì thiết kế tốt.
Richard

Re: mua trước khi bạn xây dựng - bạn không thể buộc một công ty định hình doanh nghiệp của họ thành phần mềm khi họ muốn phần mềm được xây dựng phù hợp với doanh nghiệp của họ. Rally và MS Project không phù hợp với nhu cầu quản lý dự án của mọi người. Ở tất cả.
Richard

Không thể ép buộc, tất nhiên. Nhưng mọi doanh nghiệp đều quyết định lợi ích cá nhân của họ. Nếu bạn không kinh doanh bán phần mềm quản lý dự án, bạn nên đánh giá xem có nên mua phần mềm đó hay không. Cũng giống như phần mềm kế toán. Ai trong tâm trí của họ sẽ viết một sổ cái chung từ đầu?
duffymo

2

Trước tiên, một số thuật ngữ, thứ bạn gọi là phía nhiệm vụ được gọi là Giao dịch và phía Báo cáo là Analytics.

Bạn đã từng đề cập đến CQRS, một cách tiếp cận tuyệt vời nhưng có rất ít ứng dụng thực tế của phương pháp này.

Những gì đã được thử nghiệm nhiều là bổ sung xử lý Giao dịch của bạn với công cụ xử lý Phân tích. Điều này đôi khi được gọi là Kho dữ liệu hoặc Khối dữ liệu. Vấn đề lớn nhất liên quan đến phân tích là việc cố gắng chạy truy vấn đối với dữ liệu giao dịch của bạn trong thời gian thực là không hiệu quả nhất vì thực sự chỉ có thể tối ưu hóa cơ sở dữ liệu để đọc hoặc viết. Đối với các giao dịch, bạn muốn tốc độ ghi cao để tránh sự chậm trễ trong xử lý / thực hiện. Để báo cáo, bạn muốn tốc độ đọc cao để có thể đưa ra quyết định.

Làm thế nào để giải thích cho những vấn đề này? Cách tiếp cận đơn giản nhất để hiểu là sử dụng lược đồ làm phẳng cho báo cáo của bạn và ETL (trích xuất tải biến đổi) để đưa dữ liệu từ lược đồ giao dịch được chuẩn hóa sang lược đồ phân tích không chuẩn hóa. ETL được điều hành thông qua một đại lý một cách thường xuyên và tải trước bảng phân tích để nó sẵn sàng để đọc nhanh từ công cụ báo cáo của bạn.

Một cuốn sách tuyệt vời để tăng tốc độ lưu trữ dữ liệu là Bộ công cụ kho dữ liệu của Ralph Kimball. Đối với một cách tiếp cận nhiều hơn về cách tiếp cận. Tải xuống bản dùng thử SQL Server và chọn bộ công cụ Microsoft Data Warehouse , phần thảo luận chung về cuốn sách đầu tiên nhưng chỉ ra cách áp dụng các khái niệm bằng SQL Server.

Có một số cuốn sách được liên kết từ những trang đó đi sâu vào chi tiết hơn về ETL, Star Schema Design, BI, Dashboards và các chủ đề khác để giúp bạn đi cùng.

Cách nhanh nhất để đi từ nơi bạn đến đến nơi bạn muốn, là thuê một Chuyên gia BI và theo dõi anh ta trong khi anh ta thực hiện những gì bạn cần.


Chào Mike. Tôi rất quen thuộc với kho dữ liệu và BI, đã làm việc đó được 15 năm. Câu hỏi của tôi liên quan đến cách xử lý vấn đề này trong bối cảnh thiết kế hướng tên miền. Các căn hộ dữ liệu có ổn không? Hay họ là một sự pha trộn của lớp kinh doanh tên miền của bạn? Nếu câu trả lời là xây dựng một kho dữ liệu và lấy dữ liệu từ đó, thì có rất nhiều tài liệu và lời khuyên cho việc đó. Nhưng sau đó, bạn đang sao chép logic kinh doanh bên ngoài miền của bạn. Ổn chứ? Đó là câu hỏi của tôi.
Richard

Giống như tôi đã đề cập đến các địa chỉ CQRS cần bằng cách tách kho lưu trữ thành một bên Lệnh (giao dịch) và Truy vấn (báo cáo). Nhưng ngay cả khi không có các bẫy khác của CQRS, kho dữ liệu và etl là máy khách của miền của bạn nhưng họ không sửa đổi nó. Vì vậy, BL vẫn được chứa trong miền.
Michael Brown

1
Họ không sửa đổi tên miền ... vậy tất cả các quy trình ETL và chuyển đổi dữ liệu để tạo dữ liệu cho kho dữ liệu phải đi qua miền của bạn? Mặt khác, BL của bạn được sao chép trong tất cả logic của các quy trình ETL của bạn.
Richard

1
Có, tôi muốn nói rằng một ETL nên Ý TƯỞNG sử dụng tên miền trực tiếp. Điều đó sẽ cho phép bạn tránh các công cụ dễ vỡ phải được viết lại với mỗi thay đổi bên trong cơ sở dữ liệu.
Michael Brown

2

Còn phía báo cáo thì sao? Các kho dữ liệu có được chấp nhận hay chúng có thiết kế xấu vì chúng kết hợp logic kinh doanh trong cơ sở dữ liệu và chính dữ liệu đó?

Tôi không nghĩ rằng bạn đang nói về logic kinh doanh, đây là logic báo cáo nhiều hơn. Người dùng làm gì với thông tin trên màn hình này, nó chỉ đơn giản là để cập nhật trạng thái? Mô hình miền của bạn được sử dụng để mô hình hóa các hoạt động giao dịch, báo cáo là một mối quan tâm khác. Kéo dữ liệu từ SQL Server hoặc đưa nó vào kho dữ liệu là tốt cho các tình huống báo cáo.

Mô hình miền của bạn nên thực thi các bất biến của tên miền của bạn, chẳng hạn như thành viên dự án không thể đặt trước cho cùng một dự án hoặc chỉ có thể đặt x số giờ mỗi tuần. Hoặc bạn không thể đặt trước cho dự án này vì nó đã hoàn tất, v.v ... trạng thái của mô hình miền của bạn (dữ liệu) có thể được sao chép để báo cáo riêng.

Để cải thiện hiệu suất truy vấn, bạn có thể sử dụng chế độ xem cụ thể hóa. Khi một hoạt động được cam kết với mô hình của bạn (ví dụ: Sách 4 giờ của người này dự án x) và thành công, nó có thể đưa ra một sự kiện mà sau đó bạn có thể lưu trữ trong cơ sở dữ liệu báo cáo và thực hiện các phép tính cần thiết cho báo cáo của mình. Sau đó sẽ rất nhanh để truy vấn về nó.

Giữ riêng biệt bối cảnh giao dịch và báo cáo của bạn, cơ sở dữ liệu quan hệ được xây dựng để báo cáo mô hình miền không.

BIÊN TẬP

Bài viết trên blog hữu ích về đề tài này http://se-thinking.blogspot.se/2012/08/how-to-handle-reporting-with-domain.html


2

Đó là 4 năm sau và tôi chỉ tìm thấy câu hỏi này một lần nữa, và tôi có câu trả lời cho tôi.

Tùy thuộc vào ứng dụng của bạn và nhu cầu cụ thể của nó, cơ sở dữ liệu tên miền / giao dịch và báo cáo của bạn có thể là "hệ thống" hoặc "công cụ" riêng biệt hoặc chúng có thể được phục vụ bởi một hệ thống. Tuy nhiên, chúng nên tách biệt về mặt logic - có nghĩa là chúng sử dụng các phương thức khác nhau để truy xuất và cung cấp dữ liệu cho UI.

Tôi thích chúng tách biệt về mặt vật lý (ngoài việc tách biệt về mặt logic), nhưng rất nhiều lần bạn bắt đầu chúng cùng nhau (về mặt vật lý) và sau đó, khi ứng dụng đáo hạn, bạn tách chúng ra.

Dù bằng cách nào, một lần nữa, chúng nên khác nhau về mặt logic. Bạn có thể sao chép logic nghiệp vụ trong hệ thống báo cáo. Điều quan trọng là hệ thống báo cáo có cùng câu trả lời với hệ thống tên miền - nhưng rất có thể nó sẽ đến đó thông qua các phương tiện khác nhau. Ví dụ: hệ thống tên miền của bạn sẽ có rất nhiều quy tắc kinh doanh rất nghiêm ngặt được triển khai theo mã thủ tục (có thể). Hệ thống báo cáo có thể thực hiện các quy tắc tương tự khi đọc dữ liệu nhưng sẽ thực hiện thông qua mã dựa trên SET (ví dụ: SQL).

Đây là một sự phát triển của kiến ​​trúc ứng dụng của bạn trên thực tế có thể trông giống như khi nó phát triển:

Cấp 1 - Hệ thống báo cáo và miền được phân tách hợp lý, nhưng vẫn trong cùng một cơ sở dữ liệu và cơ sở dữ liệu

Cấp 1 - Hệ thống báo cáo và miền được phân tách hợp lý, nhưng vẫn trong cùng một cơ sở mã

Cấp độ 2 - Hệ thống báo cáo và miền được phân tách hợp lý, nhưng hiện có cơ sở dữ liệu riêng biệt, có đồng bộ hóa.

Cấp độ 2 - Hệ thống báo cáo và miền được phân tách hợp lý, nhưng hiện có cơ sở dữ liệu riêng biệt

Cấp độ 3 - Hệ thống báo cáo và miền được phân tách hợp lý và vật lý và cơ sở dữ liệu riêng biệt với đồng bộ hóa.

Cấp độ 3 - Hệ thống báo cáo và miền được phân tách hợp lý và vật lý và cơ sở dữ liệu riêng biệt với đồng bộ hóa.

Ý tưởng chính là báo cáo và tên miền có nhu cầu hoàn toàn khác nhau. Các cấu hình dữ liệu khác nhau (đọc so với ghi và cập nhật tần số), các yêu cầu hiệu suất khác nhau, v.v ... Vì vậy, chúng cần được thực hiện khác nhau và điều đó đòi hỏi phải có sự trùng lặp logic logic kinh doanh.

Doanh nghiệp của bạn sẽ nghĩ ra cách giữ cho logic kinh doanh của tên miền và hệ thống báo cáo được cập nhật với nhau.


1

báo cáo / bảng điều khiển là cần thiết để hiển thị một danh sách các dự án đang hoạt động

Trạng thái của mỗi dự án nên được lưu trữ dưới dạng thông tin tĩnh, được tính toánđược định dạng tốt trong cơ sở dữ liệu và mọi mô phỏng nên được xử lý trên máy khách dưới dạng WebApp.

ngày cạn kiệt ngân sách ở mức hiện tại

loại chiếu này không nên chạy theo yêu cầu. Quản lý thông tin này theo yêu cầu, như thực hiện các tính toán về tài nguyên, tỷ lệ, nhiệm vụ, cột mốc, v.v., sẽ dẫn đến việc sử dụng rộng rãi lớp tính toán mà không sử dụng lại các kết quả này cho các cuộc gọi trong tương lai.

Tưởng tượng một môi trường phân tán ( đám mây riêng hoặc công cộng ), bạn sẽ nhận được các chi phí khổng lồ trong lớp tính toán, sử dụng cơ sở dữ liệu thấp và thiếu bộ nhớ cache.

Điều này có nên được chạy qua tên miền đầu tiên? Hiệu suất thì sao?

Thiết kế phần mềm của bạn phải bao gồm khả năng thực hiện chuẩn hóa các tính toán cần thiết để có được kết quả cần thiết trong quá trình "nhập dữ liệu", không phải trong quá trình đọc. Cách tiếp cận này làm giảm đáng kể việc sử dụng tài nguyên máy tính và trên hết là tạo các bảng có thể được coi là "chỉ đọc" bởi khách hàng. Đây là bước đầu tiên để tạo ra một cơ chế lưu trữ vững chắc và đơn giản.

Vì vậy, tìm kiếm trước tiên, trước khi hoàn thành kiến ​​trúc phần mềm, nó có thể là Hệ thống bộ nhớ cache phân tán .

(yêu cầu: tổng hợp)! = 1: 1

Do đó, sự cân nhắc của tôi là (đối với cả ví dụ thứ nhất và thứ hai), hãy cố gắng hiểu khi nào là đúng để bình thường hóa dữ liệu, có mục tiêu giảm tổng hợp cho mỗi yêu cầu của khách hàng. Không thể là 1: 1 (yêu cầu: tổng hợp) nếu một mục tiêu có được một hệ thống bền vững.

Phân phối tính toán trên máy khách

Một câu hỏi khác, trước khi hoàn thành thiết kế phần mềm, có thể là, chúng ta muốn ủy quyền cho trình duyệt của khách hàng bao nhiêu?

Nó được đặt tên là MV *, đúng là ngày nay nó là mốt, ngoài ra, một trong những mục đích của nó là tạo WebApp (ứng dụng một trang), có thể được coi là hiện tại của nhiều ứng dụng phức tạp (và may mắn thay cho các hóa đơn chúng tôi trả tiền cho nhà cung cấp đám mây, những thứ này được thực thi trong máy khách).

Do đó, kết luận của tôi là:

  1. Hiểu có bao nhiêu thao tác thực sự cần thiết để thực hiện việc trình bày dữ liệu;

  2. Phân tích có bao nhiêu trong số này có thể được thực hiện trong nền (và sau đó được phân phối qua hệ thống bộ đệm, sau khi chuẩn hóa chúng);

  3. Hiểu có bao nhiêu thao tác có thể được thực thi trong máy khách, nhận cấu hình của các dự án, chạy nó trên Chế độ xem trên WebApp và do đó giảm tính toán được thực hiện trong back-end;


Xin chào Marcocs, cảm ơn câu trả lời của bạn. Hai vấn đề tôi thấy khi thực hiện các tập hợp trước ở phía khách hàng là 1. bạn có RẤT NHIỀU hành động có thể dẫn đến tiền xử lý và 2. Có thể cần RẤT NHIỀU tiền định. Đặt cả hai lại với nhau và bạn có được sử dụng tài nguyên thực sự nặng. Ví dụ: ngân sách sẽ phải được tính toán lại khi A. bất kỳ tỷ lệ hóa đơn nào đối với ngân sách thay đổi (điều này có thể được kích hoạt bởi một số điều ... hành động của người dùng hoặc cuộn qua lịch trình theo tỷ lệ mới, ví dụ như tỷ lệ thay đổi vào đầu năm tài chính mới) hoặc B. Thành phần ngân sách ...
richard

... thay đổi ví dụ giờ được thêm hoặc trừ. V.v. Danh sách này tiếp tục. Theo như # 2 các tập hợp cần thiết ... ngày mai khách hàng cần xem các tập hợp theo khu vực, sau đó họ muốn xem theo nhân viên, theo thành phố, hoặc ngành hoặc bất kỳ thuộc tính điên rồ nào khác trong dự án hoặc thực thể liên quan. Bạn sẽ tổng hợp trước tất cả những điều này? Nếu vậy, bây giờ bạn đang tạo một công cụ OLAP ... Ngoài ra, các tập hợp này có được lưu trữ trong Đối tượng dự án trong miền không? Khi bạn trình bày dữ liệu, khi nào bạn sẽ sử dụng giá trị được tính so với giá trị được tính toán trước. V.v. Bạn đã thực hiện công việc này trong một ứng dụng thế giới thực?
Richard

Tôi quan tâm đến phương pháp này nhưng nó có rất nhiều vấn đề đối với tôi.
giàu

Tôi có một hệ thống phân phối thu nhập đang hoạt động, vấn đề của tôi là hiển thị trạng thái thu nhập hiện tại, dựa trên dữ liệu được tạo bởi các mạng con của các đại lý (bao gồm rút tiền, gửi tiền, jackpot, ..). Các mạng con, họ sử dụng số dư của mình liên tục, điều này làm tăng / quyết định lợi nhuận của cha mạng. Việc phân phối thu nhập được thực hiện định kỳ vào mỗi thứ Hai, vấn đề là cho thấy sự tiến hóa của thời gian thực và cập nhật ảo ngân sách của tất cả các mạng.
marcocs

Để tránh tập hợp trên các mạng và phân phối tất cả các giá trị trong thời gian thực bất cứ khi nào yêu cầu được thực hiện, quy trình triển khai tạm thời được thực hiện liên tục để bình thường hóa thu nhập của các mạng. các giá trị không được bao gồm trong triển khai tạm thời (tôi chỉ làm việc với mục cập nhật mới nhất). Bảng giao dịch (rõ ràng là bảng chịu tải trong ứng dụng này), được xử lý với các phân vùng bảng .
marcocs

1

Sử dụng bộ đệm cho truy vấn, sử dụng tên miền để lưu trữ.

Có một tính năng gọi là "người dùng hàng đầu" trên stackoverflow. Bạn có thể tìm thấy một dòng trên mông của trang người dùng hàng đầu, nói rằng "Chỉ những câu hỏi và câu trả lời không thuộc cộng đồng wiki mới được bao gồm trong các tổng số này ( được cập nhật hàng ngày )". Điều này cho thấy dữ liệu được lưu trữ.

Nhưng tại sao?

Đối với vấn đề hiệu suất có thể. Có lẽ họ có cùng mối quan tâm với logic miền bị rò rỉ ("Chỉ những câu hỏi và câu trả lời không thuộc cộng đồng wiki mới được đưa vào tổng số này" trong trường hợp này).

Làm sao?

Tôi thực sự không biết làm thế nào họ làm điều này, vì vậy đây chỉ là một phỏng đoán :)

Đầu tiên, chúng ta cần tìm câu hỏi / câu trả lời mục tiêu. Một tác vụ lập lịch có thể hoạt động, chỉ cần tìm nạp tất cả các mục tiêu tiềm năng.

Thứ hai, chúng ta hãy chỉ nhìn vào một câu hỏi / câu trả lời. Đây có phải là một cộng đồng không wiki? Có phải trong vòng 30 ngày? Thật dễ dàng để trả lời với các mô hình miền. Đếm số phiếu và lưu trữ chúng nếu hài lòng.

Bây giờ chúng ta có bộ đệm, chúng là đầu ra của các dẫn xuất tên miền. Truy vấn nhanh và dễ dàng vì chỉ có các tiêu chí đơn giản được áp dụng.

Điều gì xảy ra nếu kết quả cần phải là "thời gian thực" hơn?

Sự kiện có thể giúp đỡ. Thay vì kích hoạt bộ đệm ẩn với tác vụ lập lịch, chúng tôi có thể chia quy trình thành nhiều quy trình phụ. Ví dụ: khi ai đó bỏ phiếu cho câu trả lời của hippoom, chúng tôi sẽ xuất bản một sự kiện kích hoạt cập nhật bộ đệm của người dùng hàng đầu của hippoom. Trong trường hợp này, chúng ta có thể thấy các nhiệm vụ nhỏ nhanh chóng thường xuyên.

CQRS có cần thiết không?

Không phải với cách tiếp cận nhiệm vụ lập kế hoạch cũng như với cách tiếp cận sự kiện. Nhưng cqrs có một lợi thế. Bộ nhớ cache thường được định hướng hiển thị cao, nếu ban đầu một số mục không bắt buộc, chúng tôi có thể không tính toán và lưu trữ chúng vào bộ đệm. CQRS với tìm nguồn cung ứng sự kiện giúp xem xét lại bộ đệm cho dữ liệu lịch sử bằng cách phát lại các sự kiện.

Một số câu hỏi liên quan:
1. https://stackoverflow.com/questions/21152958/how-to-handle-summary-report-in-cqrs 2. https://stackoverflow.com/questions/19414951/how-to-use -rich-domain-with-mass-Operations / 19416703 # 19416703

Hy vọng nó giúp :)


0

Tuyên bố miễn trừ trách nhiệm:
Tôi khá thiếu kinh nghiệm trong các ứng dụng với mô hình miền.
Tôi hiểu tất cả các khái niệm và tôi đã suy nghĩ rất lâu về cách áp dụng các khái niệm này cho các ứng dụng tôi đang làm việc (vốn giàu miền, nhưng thiếu OO, mô hình miền thực tế, v.v.) .
Câu hỏi này là một trong những vấn đề chính mà tôi phải đối mặt là tốt. Tôi có một ý tưởng làm thế nào để giải quyết vấn đề này, nhưng như tôi vừa nói ... đó chỉ là một ý tưởng mà tôi nghĩ ra.
Tôi đã không thực hiện nó trong một dự án thực tế, nhưng tôi không thấy lý do tại sao nó không hoạt động.


Bây giờ tôi đã nói rõ, đây là những gì tôi nghĩ ra - Tôi sẽ sử dụng ví dụ đầu tiên của bạn (số liệu dự án) để giải thích:

Khi ai đó chỉnh sửa dự án, bạn vẫn đang tải và lưu nó thông qua mô hình miền của mình.
Trong thời điểm này, bạn tất cả thông tin được tải để tính toán tất cả các số liệu của bạn (tổng ngân sách, nỗ lực cho đến nay, v.v.) cho dự án này.

Bạn có thể tính toán điều này trong mô hình miền và lưu nó vào cơ sở dữ liệu với phần còn lại của mô hình miền.
Vì vậy, Projectlớp trong mô hình miền của bạn sẽ có một số thuộc tính như TotalBudget, EffortToDatev.v. và cũng sẽ có các cột có các tên đó trong các bảng cơ sở dữ liệu nơi mô hình miền của bạn được lưu trữ (trong cùng một bảng hoặc trong một bảng riêng biệt ... không 'vấn đề) .

Tất nhiên, bạn cần thực hiện chạy một lần để tính giá trị cho tất cả các dự án hiện có khi bạn bắt đầu với điều này. Nhưng sau đó, dữ liệu được tự động cập nhật với các giá trị được tính hiện tại mỗi khi dự án được chỉnh sửa thông qua mô hình miền.

Vì vậy, bất cứ khi nào bạn cần bất kỳ loại báo cáo nào, tất cả dữ liệu cần thiết đã có sẵn (được tính toán trước) và bạn chỉ có thể làm một cái gì đó như thế này:

select ProjectName, TotalBudget, EffortToDate from Projects where TotalBudget > X

Không quan trọng bạn lấy dữ liệu trực tiếp từ các bảng nơi mô hình miền được lưu trữ hay nếu bạn bằng cách nào đó trích xuất dữ liệu sang cơ sở dữ liệu thứ hai, vào kho dữ liệu hoặc bất cứ điều gì:

  1. Nếu cửa hàng báo cáo của bạn khác với cửa hàng dữ liệu thực tế của bạn, bạn chỉ có thể sao chép dữ liệu từ "bảng mô hình miền"
  2. Nếu bạn trực tiếp truy vấn kho dữ liệu thực tế của mình, dữ liệu đã có sẵn và bạn không cần phải tính toán bất cứ điều gì

Trong cả hai trường hợp, logic nghiệp vụ cho các tính toán nằm ở chính xác một nơi: mô hình miền.
Bạn không cần nó ở bất cứ nơi nào khác, vì vậy không cần thiết phải sao chép nó.


Xin chào Christian, tôi rất vui khi thấy tôi không phải là người duy nhất đấu tranh với điều này. Cảm ơn câu trả lời của bạn. Xem ý kiến ​​của tôi về câu trả lời của Marcocs cho các vấn đề tôi thấy với phương pháp này. Bất kỳ ý tưởng về việc đối phó với những người sẽ được đánh giá cao!
giàu
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.