มีรูปแบบการออกแบบสำหรับการจัดการความสัมพันธ์แบบหลายต่อหลายลึกหรือไม่


10

ฉันมีปัญหาในการกำหนดรูปแบบข้อมูลนี้ฉันได้พบกับการทำงานกับหลายแอปพลิเคชัน

มันประกอบด้วย:

  1. ชนิดของวัตถุที่ประกอบด้วยวัตถุจำนวนมาก
  2. ประเภทวัตถุที่สองที่แต่ละอินสแตนซ์ 'มีหลาย' ของวัตถุแรก
  3. และแต่ละวัตถุย่อยของวัตถุแรกจะแก้ไขได้ในแต่ละการเชื่อมโยงกับประเภทวัตถุที่สอง

ตัวอย่างง่ายๆอาจเป็น:

  1. หลักสูตรการเขียนโปรแกรมประกอบด้วยชุดบทเรียน
  2. บทเรียนประกอบด้วยชุดที่ได้รับมอบหมาย
  3. สามารถกำหนดหลักสูตรให้กับนักเรียนได้
  4. อย่างไรก็ตามเมื่อกำหนดหลักสูตรให้กับนักเรียนแต่ละบทเรียนและ / หรือการมอบหมายสามารถปรับแต่งให้กับนักเรียนที่มีการลบและเพิ่มเติมไปยังจุดที่หลักสูตรดั้งเดิมอาจไม่สามารถจดจำได้

ในโซลูชันของฉันผลลัพธ์นี้คืออะไร:

เมื่อกำหนดหลักสูตรให้กับนักเรียนหลักสูตรจะถูกโหลดลงในหน่วยความจำ จากนั้นสำหรับแต่ละวัตถุย่อยวัตถุนักเรียน / วัตถุความสัมพันธ์ย่อยจะถูกสร้างขึ้นด้วยข้อมูลเมตาที่เหมาะสม โดยพื้นฐานแล้วฉันใช้วัตถุดั้งเดิมเป็นแม่แบบเพื่อสร้างวัตถุที่กำหนดเองได้ที่ต้องการ

ส่งผลให้มีข้อมูลจำนวนมากเนื่องจากวัตถุย่อยมีความซับซ้อนและมีจำนวนมากขึ้น ฉันสงสัยว่ามีการเพิ่มประสิทธิภาพหรือรูปแบบบางอย่างเพื่อลดปริมาณของตรรกะ / ความซับซ้อนที่จำเป็นในการจัดการรูปแบบข้อมูลนี้


2
คุณแน่ใจหรือไม่ว่าต้องการ "ลดจำนวนข้อมูล" คุณกำลังมองหาวิธีที่จะ "ลดจำนวนโค้ดและตรรกะที่ไม่ใช่เรื่องไร้สาระ" ที่ต้องเขียนเพื่อนำไปใช้กับพฤติกรรมที่ต้องการหรือไม่? (ผมสังเกตเห็นว่าการบริหารจัดการอย่างต่อเนื่องของข้อมูลที่ต้องใช้โครงสร้างข้อมูลเชิงสัมพันธ์คล้ายกับฐานข้อมูล.)
rwong

@rwong ใช่ "ลด [ไอเอ็นจี] ปริมาณของรหัสและตรรกะที่ไม่สำคัญ" คือเป้าหมายสุดท้ายของฉัน สำหรับฉันนั่นหมายถึงการลดความซับซ้อนของข้อมูลในบางวิธี แต่นั่นไม่จำเป็นต้องเป็นข้อกำหนด มันกลายเป็นรูปแบบข้อมูลทั่วไปที่ฉันสงสัยว่ามีวิธีที่ง่ายกว่าในการจัดการ
Nicholas Pickering

1
โดยหลักการแล้วนี่เป็นเวอร์ชันปรับปรุงของความสัมพันธ์ m: n สิ่งที่เกี่ยวกับชื่อเช่น»วิธีการจัดการความสัมพันธ์ของวัตถุที่ซับซ้อน«?
Thomas Junk

1
ข้อมูลจำนวนมากไม่เหมือนกับความซับซ้อนของข้อมูลในระดับมาก ความยากในการจัดการสิ่งที่คุณกำลังสร้างอาจจะเติบโตไปพร้อมกับความซับซ้อนมากกว่าปริมาณ
Walter Mitty

1
น่าสนใจ ฉันได้ทำงานกับแอพพลิเคชั่นหลายตัวที่มีรูปแบบนี้ แต่ไม่เคยเห็นมาก่อนว่ามันเป็นรูปแบบ ชอบที่จะเห็นวิธีที่ง่ายกว่าในการจัดการข้อมูลประเภทนี้
จูลส์

คำตอบ:


6

ฉันเห็นตัวเลือกบางอย่างขึ้นอยู่กับสิ่งที่คุณต้องการ: (1) ถ้ามีอินสแตนซ์ที่ไม่ซ้ำกันจำนวนมากที่ทำตามอัลกอริทึมทั่วไป (2) ถ้ามีวัตถุที่คล้ายกันมากหรือคุณจะสร้างวัตถุในเวลาทำงานและ (3) ถ้า คุณต้องการที่จะปรับเปลี่ยนพฤติกรรมของวัตถุในขณะที่ทำงาน หมายเหตุ: คุณสามารถรวมรูปแบบทั้งหมดที่ฉันพูดถึงที่นี่ถ้าจำเป็น

  1. หากแต่ละ "ประเภทวัตถุที่สอง" ไม่ซ้ำกัน แต่มีรูปแบบการทำงานที่คล้ายคลึงกันคุณสามารถใช้รูปแบบเทมเพลตได้ ดูเหมือนคุณจะทำสิ่งนี้ แต่เพื่อให้ชัดเจนนามธรรมคลาสพื้นฐานของคุณมีอัลกอริทึมทั่วไปที่ตั้งโปรแกรม ขั้นตอนบางอย่างของอัลกอริทึมนี้มีการใช้งานในคลาสที่ได้รับ

  2. ถ้าคุณจะสร้างวัตถุจำนวนมากหรือถ้าสร้างวัตถุที่เวลาทำงานเป็นสิ่งสำคัญที่คุณคุณสามารถใช้รูปแบบโรงงาน

  3. และถ้าคุณต้องการเปลี่ยนพฤติกรรมแบบไดนามิกStategy Patternสามารถใช้งานได้ ตัวอย่างเช่นหากนักเรียนในหลักสูตรปกติได้รับการตัดสินว่าเป็นความต้องการพิเศษหรือเข้าสู่โปรแกรมเร่งความเร็ว มันทำงานได้โดยการเขียน "นักเรียน" ของวัตถุที่จะเป็นตัวแทนของชั้นฐานของหลักสูตร หลักสูตรจะถูกกำหนดให้กับหลักสูตรที่ได้รับในการก่อสร้างของนักเรียน (ที่ฟังดูแปลก) และสามารถกำหนดใหม่ให้กับหลักสูตรอื่นที่ได้รับในภายหลัง

(แค่ FYI หากใช้ (3) รูปแบบกลยุทธ์ด้วย C ++ คุณจะต้อง Rvalues ​​สำหรับการแต่งเพลง)

ในการจัดเก็บวัตถุและวัตถุที่สองของคุณอาจพิจารณารูปแบบตัววนซ้ำ (เพื่อวนรอบวัตถุเหล่านั้นเพิ่มลบจัดเรียง ฯลฯ )

การอ้างอิงที่ดีคือรูปแบบการออกแบบ Head Firstซึ่งครอบคลุมรูปแบบที่ฉันพูดถึงและการใช้งาน พวกเขาทำงานใน Java


0

ฉันพบว่ามันยากที่จะเชื่อภายใต้การปรากฏตัวของดาต้า - สโตร์หรือการคงอยู่คุณจะต้องมีวัตถุที่มีความลึกเช่นนี้ ณ จุดใดจุดหนึ่งในเวลาใช้งาน นี่สำหรับ CRUD GUI หรือไม่ ถ้าเป็นเช่นนั้นฉันขอแนะนำให้เปลี่ยนแนวทางของคุณตั้งแต่เริ่มต้น IE:

ระบุโครงสร้างพื้นฐานที่จำเป็นสำหรับนักศึกษาที่จะแสดงและstatefullyเก็บดัชนีกำเนิดกลับไปยังฐานข้อมูลและstatelesslyอัปเดตที่จะไปหรือจากมุมมองและฐานข้อมูลแบ็กเอนด์


ฉันไม่แน่ใจว่าฉันเข้าใจคำแนะนำของคุณ ฉันควรสร้าง subobject ที่ว่างเปล่าจากนั้นบังคับผู้ใช้ให้อยู่ในรูปแบบอื่นซึ่งอนุญาตให้แก้ไข subobject ได้หรือไม่
Nicholas Pickering

ฉันขอแนะนำให้วัตถุในตัวของมันเองไม่ได้ผลมากนักหากสิ่งที่คุณทำคือการทำธุรกรรมที่ไร้สัญชาติระหว่างเนื้อหาของพวกเขากับฐานข้อมูลส่วนหลัง หากเป็นกรณีนี้ให้ลบออกและทำธุรกรรมสำหรับข้อมูลเฉพาะกับสิ่งที่ลูกค้าต้องการ
John P. Feltz

แก้ไข: นี่อาจหมายถึงการสร้างวัตถุเพื่อจับข้อมูลเฉพาะที่กำลังทำธุรกรรมหากคุณมีอคติต่อ ORM เนื่องจากความสะดวกสบายของพวกเขาในส่วนนั้น
John P. Feltz

ถ้าฉันไม่เข้าใจผิดฉันก็ไม่คิดว่าจะมีกระบวนการใดที่ไร้สัญชาติ ทุกอย่างขึ้นอยู่กับบริบทของการกระทำของผู้ใช้ เมื่อผู้ใช้สร้างวัตถุหลักพวกเขาคาดว่าโครงสร้างย่อยจะสามารถแก้ไขได้ทันที
Nicholas Pickering

-1

หลักสูตรที่กำหนดเองสำหรับนักเรียนแต่ละคนจนถึงจุดที่หลักสูตรดั้งเดิมไม่สามารถจดจำได้ชี้ให้เห็นว่าหลักสูตรดั้งเดิมนั้นเป็นเพียงการอ้างอิง“ เริ่มต้น” สิ่งที่ฉันจะทำคือสร้างคลาสที่เรียกว่า CustomizedCourse (หรือรายการของพวกเขา) และมี (หรือรายการนั้น) เป็นทรัพย์สินของนักเรียน CustomizedCourse สามารถมีการอ้างอิงถึงหลักสูตรดั้งเดิมสำหรับการใช้งาน "อ้างอิง" แต่งานหลักและข้อมูลจะอยู่ใน CustomizedCourse เอง


downvoter สนใจที่จะแสดงความคิดเห็น?
frezq

ฉันไม่ได้ลงคะแนน (ฉันเป็น OP) แต่ดูเหมือนว่าคุณกำลังพยายามอธิบายแม่แบบหรือรูปแบบกลยุทธ์ซึ่งได้อธิบายไว้แล้วในคำตอบอื่น
Nicholas Pickering
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.