Có một mẫu thiết kế để quản lý các mối quan hệ nhiều-nhiều-sâu?


10

Tôi gặp sự cố khi xác định mẫu dữ liệu này. Tôi đã bắt đầu làm việc trên một số ứng dụng.

Nó bao gồm:

  1. Một loại đối tượng bao gồm nhiều đối tượng
  2. Một loại đối tượng thứ hai, trong đó mỗi đối tượng 'có nhiều' đối tượng đầu tiên
  3. Và, mỗi đối tượng phụ của đối tượng thứ nhất có thể sửa đổi theo từng liên kết với loại đối tượng thứ hai.

Một ví dụ đơn giản có thể là:

  1. Một khóa học lập trình bao gồm một tập hợp các bài học
  2. Các bài học bao gồm một bài tập tập hợp.
  3. Một khóa học có thể được chỉ định cho một sinh viên.
  4. Tuy nhiên, một khi khóa học được chỉ định cho một sinh viên, mỗi bài học và / hoặc bài tập có thể được tùy chỉnh cho sinh viên đó, với việc loại bỏ và bổ sung, đến mức mà khóa học ban đầu có thể không được nhận ra.

Trong các giải pháp của tôi, những gì kết quả này là:

Khi giao một khóa học cho một sinh viên, khóa học được tải vào bộ nhớ. Sau đó, đối với mỗi đối tượng phụ, một đối tượng quan hệ sinh viên / đối tượng phụ được tạo với siêu dữ liệu phù hợp. Về cơ bản, tôi đang sử dụng đối tượng ban đầu làm mẫu để tạo các đối tượng tùy chỉnh cần thiết.

Điều này dẫn đến một lượng dữ liệu khổng lồ khi các đối tượng phụ trở nên phức tạp và được đánh số hơn. Tôi tự hỏi nếu có một số tối ưu hóa hoặc mẫu để giảm lượng logic / độ phức tạp cần thiết để thao tác mẫu dữ liệu này.


2
Bạn có chắc chắn muốn "giảm lượng dữ liệu" không? Thay vào đó, bạn đang tìm cách để "giảm số lượng mã và logic không tầm thường" cần được viết để thực hiện các hành vi cần thiết? (Tôi nhận thấy rằng việc quản lý dữ liệu liên tục đòi hỏi cấu trúc dữ liệu quan hệ, tương tự như cơ sở dữ liệu.)
rwong

@rwong Có, "giảm [ing] số lượng mã và logic không tầm thường" là mục tiêu cuối cùng của tôi. Đối với tôi, điều đó có nghĩa là giảm độ phức tạp dữ liệu theo một cách nào đó, nhưng đó không nhất thiết là một yêu cầu. Nó trở thành một mẫu dữ liệu phổ biến đến mức tôi tự hỏi liệu có cách nào đơn giản hơn để quản lý nó không.
Nicholas Pickering

1
Về nguyên tắc đây là phiên bản nâng cao của mối quan hệ m: n. Thế còn một tiêu đề như »Làm thế nào để quản lý các mối quan hệ đối tượng phức tạp«?
Thomas Junk

1
Một lượng dữ liệu khổng lồ không giống như mức độ phức tạp lớn trong dữ liệu. Khó khăn trong việc quản lý những gì bạn đang xây dựng có thể sẽ tăng lên với sự phức tạp nhiều hơn so với khối lượng.
Walter Mitty

1
Hấp dẫn. Tôi đã làm việc trên một số ứng dụng có mẫu này, nhưng chưa bao giờ phát hiện ra rằng đó là mẫu. Cũng thích nhìn thấy những cách đơn giản hơn để quản lý loại dữ liệu này.
Jules

Câu trả lời:


6

Tôi thấy một vài tùy chọn tùy thuộc vào những gì bạn cần: (1) nếu có nhiều trường hợp duy nhất tuân theo thuật toán chung, (2) nếu có nhiều đối tượng tương tự hoặc bạn sẽ tạo các đối tượng vào thời gian chạy và (3) nếu bạn muốn tự động sửa đổi hành vi của đối tượng trong khi chạy. Lưu ý: bạn có thể kết hợp tất cả các mẫu tôi đề cập ở đây, nếu cần.

  1. Nếu mỗi "loại đối tượng thứ hai" là duy nhất nhưng tuân theo một mẫu hành vi tương tự, bạn có thể sử dụng Mẫu Mẫu . Có vẻ như bạn có thể đang làm điều này. Nhưng để làm cho nó rõ ràng, lớp cơ sở trừu tượng của bạn có thuật toán chung được lập trình; các bước nhất định của thuật toán này được thực hiện trong các lớp dẫn xuất.

  2. Nếu bạn sẽ tạo nhiều đối tượng hoặc nếu việc tạo đối tượng trong thời gian chạy là quan trọng đối với bạn, bạn có thể sử dụng Mô hình nhà máy .

  3. Và nếu bạn muốn thay đổi linh hoạt hành vi, Mẫu chiến lược có thể hoạt động. Ví dụ, nếu một học sinh trong một chương trình giảng dạy thông thường được quyết định là nhu cầu đặc biệt hoặc đi vào một chương trình tăng tốc. Điều này hoạt động bằng cách soạn "học sinh" của một đối tượng sẽ đại diện cho một lớp cơ sở của chương trình giảng dạy. Chương trình giảng dạy sẽ được chỉ định cho một chương trình giảng dạy xuất phát trong quá trình xây dựng của học sinh (nghe có vẻ kỳ lạ) và có thể được chuyển sang một chương trình giảng dạy khác sau đó.

(Chỉ FYI, nếu sử dụng (3) Mẫu chiến lược với C ++, bạn sẽ phải Định giá cho thành phần.)

Để lưu trữ các đối tượng và đối tượng thứ hai của bạn, có thể đáng xem xét Mô hình lặp (để xoay vòng qua chúng, thêm, xóa, sắp xếp, v.v.).

Một tài liệu tham khảo tốt là Head First Design Forms , bao gồm các mẫu tôi đề cập và triển khai chúng. Họ làm việc trong Java.


0

Tôi cảm thấy khó tin, dưới sự hiện diện của kho lưu trữ dữ liệu hoặc sự kiên trì, rằng bạn sẽ cần phải có các đối tượng với độ sâu này tại bất kỳ thời điểm nào trong thời gian chạy. Đây có phải là cho CRUD GUI không? Nếu vậy, tôi sẽ đề nghị thay đổi cách tiếp cận của bạn từ đầu. I E:

Xác định nền móng cần thiết cho Sinh Viên cho chương trình, và statefully lưu trữ của nó index gốc trở lại db, và statelessly cập nhật rằng, từ nay đến hoặc từ quan điểm và db backend.


Tôi không chắc tôi hiểu đề xuất của bạn. Tôi nên tạo một tiểu dự án trống, sau đó buộc người dùng sang một hình thức khác cho phép họ sửa đổi các tiểu dự án?
Nicholas Pickering

Tôi đề nghị rằng các đối tượng trong chính chúng không thực hiện được nhiều, nếu tất cả những gì bạn đang làm là một giao dịch không trạng thái giữa nội dung của chúng và cơ sở dữ liệu phía sau. Nếu đây là trường hợp, loại bỏ chúng và chỉ thực hiện giao dịch cho dữ liệu cụ thể với những gì phải đối mặt với khách hàng.
John P. Feelz

Chỉnh sửa: Điều này cũng có thể có nghĩa là tạo các đối tượng để thu thập dữ liệu cụ thể đó được giao dịch - nếu bạn thiên vị với ORM do sự thuận tiện của chúng trong khía cạnh đó.
John P. Feelz

Trừ khi tôi hiểu nhầm, tôi không nghĩ bất cứ điều gì về quy trình có thể được thực hiện. Tất cả phụ thuộc vào bối cảnh của hành động người dùng. Khi người dùng tạo một đối tượng chính, họ hy vọng cấu trúc con có sẵn để sửa đổi ngay lập tức.
Nicholas Pickering

-1

Một khóa học tùy chỉnh cho mỗi sinh viên đến điểm mà khóa học ban đầu không thể nhận ra được cho thấy rằng khóa học ban đầu chỉ đơn giản là một tài liệu tham khảo mặc định của Nott. Những gì tôi sẽ làm là tạo một lớp có tên là CustomC thảo (hoặc một danh sách của chúng) và lấy đó (hoặc một danh sách đó) làm tài sản của một học sinh. CustomC thảo có thể có một tài liệu tham khảo về khóa học ban đầu cho việc sử dụng trực tiếp của người dùng tham khảo trực tuyến, nhưng công việc và dữ liệu chính sẽ nằm trong chính CustomCourse.


downvoter quan tâm để bình luận?
frezq

Tôi đã không downvote (Tôi là OP), nhưng có vẻ như bạn đang cố gắng mô tả Mẫu hoặc Mẫu chiến lược đã được mô tả trong câu trả lời khác.
Nicholas Pickering
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.