ในที่สุดมันก็ใช้งานและสถาปัตยกรรมได้
สถาปัตยกรรม
ระบบนี้รองรับ "กีฬาใด ๆ " หรือไม่? เป็นความคิดที่คุณสวมหมวกนักบินอวกาศสถาปัตยกรรมของคุณและสร้างระบบทั่วไปที่สามารถจัดการกับกีฬาประเภทใดในอนาคตที่อาจไม่มีอยู่ในปัจจุบัน?
ถ้าเป็นเช่นนั้นเห็นได้ชัดว่าการมีตารางที่ตั้งชื่อแบบไดนามิกเป็นความเจ็บปวดอย่างมากดังนั้นจึงควรมีโครงสร้างที่รองรับกีฬา n หากจำเป็น
ที่กล่าวว่าฉันมีอคติที่แข็งแกร่งมากต่อวิธีการนี้: มันเกือบจะทำงานได้มากขึ้นและนำไปสู่ผลลัพธ์ที่แย่ลง การสร้าง UI, schema ฯลฯ แยกต่างหากสำหรับกีฬาแต่ละประเภทในที่สุดจะนำไปสู่ประสบการณ์การใช้งานที่ดีขึ้นและง่ายต่อการบำรุงรักษาโค้ดแม้ว่ามันจะหมายถึงการทำซ้ำจำนวนตื้น ๆ (วิธีการหลีกเลี่ยง / ย่อนี่เป็นคำถามแยก)
คุณจัดการกับผู้เล่นที่เล่นกีฬาหลายประเภทได้อย่างไร พวกเขาได้รับสองรายการ (เช่นคุณปฏิบัติต่อคนอื่น) หรือคุณกำลังพยายามทำบางสิ่งที่เฉพาะเจาะจงกับพวกเขา
ใช้
ดังนั้นสมมติว่าคุณไม่ได้เล่นกีฬาแบบไดนามิก (เช่นถ้ามีคนต้องการเพิ่มกีฬาใหม่มันต้องใช้ความพยายามในการพัฒนาเพื่อเพิ่ม)
เคยมีเวลาที่คุณแสดงผู้เล่น (หรือวัตถุอื่น ๆ ที่คุณพูดถึง) จากกีฬามากกว่าหนึ่งรายการในแต่ละครั้งหรือไม่?
ฉันเห็นสิ่งนี้สำหรับฟังก์ชั่นการค้นหาซึ่งคุณสามารถค้นหาด้วยชื่อผู้เล่นหรือทีม (โดยไม่คำนึงถึงกีฬา) แต่นอกเหนือจากนั้นฉันไม่สามารถจินตนาการได้หลายกรณี
หากคุณไม่จำเป็นต้องทำสิ่งนี้แสดงว่าแนวทางของคุณสมบูรณ์แบบที่สุด คุณสามารถหยุดอ่านได้ที่นี่
Schemas ทางเลือก
เข้าชม
ฉันเป็นแฟนของ KISS ในการพัฒนาซอฟต์แวร์ 15 ปีขึ้นไปฉันยังคงถอยกลับไปสู่ปรัชญา "สร้างสิ่งที่ง่ายที่สุดที่ทำงาน"
ดังนั้นปฏิกิริยาเริ่มต้นของฉันโดยสมมติว่าฟังก์ชั่นการค้นหาข้ามกีฬาเป็นกรณีใช้งานจริง ๆ เท่านั้นคือการสร้างมุมมอง:
SELECT PlayerName, 'NFL' as [Sport], TeamName FROM NFL_Players JOIN NFL_Teams ...
UNION
SELECT PlayerName, 'NHL' as [Sport], TeamName FROM NHL_Players JOIN NHL_Teams ...
UNION ....
แน่นอนถ้าคุณเพิ่มกีฬาใหม่คุณต้องเพิ่มในมุมมอง นอกจากนี้ยังอาจมีประโยชน์ในการรวมข้อมูลทั่วไปอื่น ๆ แต่ขึ้นอยู่กับว่าต้องแสดงอะไร
ฉันพยายามที่จะให้ทุกสิ่งที่กีฬาเฉพาะในความหมายดูเพื่อค้นหารหัสไม่จำเป็นต้องมีมากหรือรหัสเฉพาะเจาะจงใด ๆ (นอกจากอาจจะรู้วิธีการเชื่อมโยงไปยัง/nhl/players/player-name
VS /nfl/...
หรือ แต่แอปของคุณไม่ว่า)
การสืบทอดของตาราง
การสืบทอดตารางสามารถทำงานได้ แต่มีความซับซ้อน ฉันไม่มีประสบการณ์มากมายกับมันและอันที่จริงฉันคิดว่าทุกครั้งที่ฉันมีส่วนร่วมในการประเมินว่าเราทำอะไรที่ง่ายกว่า (เช่นที่ฉันแนะนำที่นี่)
โดยส่วนตัวแล้วฉันยังไม่พบว่าทำไมสิ่งนี้ถึงมีประโยชน์ แต่อาจมีกรณีการใช้ที่น่าเชื่อถือ (ซึ่งฉันไม่รู้) ที่ปรับความซับซ้อน (เช่นการสืบทอดตารางแก้ปัญหากรณีการใช้งานได้ดีกว่าโซลูชันอื่น ๆ ) .
แยกตารางสำหรับแอตทริบิวต์เฉพาะกีฬา
คุณสามารถทำplayers
ตารางเดียวซึ่งมีคุณลักษณะร่วมกันกับผู้เล่นทุกคนในกีฬาทั้งหมดและจากนั้นชุดของตารางอื่นเช่นnhl_players_details
ที่มีผู้เล่น ID และคอลัมน์พร้อมข้อมูลเพิ่มเติมเกี่ยวกับผู้เล่น หากมีคุณสมบัติทั่วไปมากมายหรือคุณมีประโยชน์หลายอย่างสำหรับ "ผู้เล่นทุกคนจากกีฬาทุกประเภท" นี่อาจสมเหตุสมผล
คู่ค่าคีย์สำหรับแอตทริบิวต์เฉพาะกีฬา
วิธีทางเลือกสมบูรณ์: มีplayers
ตาราง (อีกครั้งที่มีลักษณะที่เหมือนกันเช่นชื่อ) แล้วplayer_data
ตารางที่มีPlayerId
, Sport
, ,Attribute
Value
ชื่อแอตทริบิวต์ที่ป้อนจะเป็นแบบเฉพาะกีฬา วิธีนี้ช่วยให้คุณสามารถเพิ่มแอตทริบิวต์ใหม่โดยไม่ต้องแก้ไข schema (รหัสของคุณยังคงต้องรู้เพื่อโหลด / แสดงพวกเขาแน่นอน) ข้อเสียคือคุณสูญเสียความถูกต้องบางอย่าง: โดยทั่วไปค่าจะเป็นเขตข้อมูลสตริงดังนั้นรหัสแอปของคุณจะต้องยืดหยุ่นและจัดการกับความล้มเหลวที่อาจเกิดขึ้นการแปลงสตริงvalue
เป็นประเภทข้อมูลเฉพาะ (เช่นจำนวนเต็ม)
แน่นอนว่าแนวคิดนี้สามารถนำไปใช้กับทีมเกมและอื่น ๆ