โครงสร้างฐานข้อมูลสำหรับเกม 2v2


10

ฉันเล่นเกม 2v2 กับเพื่อน 12 คนเป็นประจำและฉันต้องการฐานข้อมูลเพื่อติดตามผู้เล่นทีมคะแนนและเกมด้วยความตั้งใจในการสร้างระบบการจัดอันดับ

เนื่องจากเราเป็นประจำเปลี่ยนทีมที่ผมเคยเกิดขึ้นกับตารางplayers, teamsและgamesที่เกมมีสองทีม (TEAM1 และ TEAM2) และทีมประกอบด้วยผู้เล่นสองคน (PLAYER1 และ Player2)

นี่ทำให้เกิดปัญหาค่อนข้างน้อย - ตัวอย่างเช่นถ้าฉันเลือกผู้เล่นสองคน (เรียกพวกเขาว่าAและB ) ให้เล่นด้วยกันฉันต้องตรวจสอบว่ามีทีมที่ Player1 คือ A และ Player2 คือ B หรือ Player1 คือ B และ Player2 คือ.

คอลัมน์gamesและwinsมีอยู่ในทั้งplayersโต๊ะและteamsโต๊ะ - แต่นี่เป็นเพราะฉันต้องการดูว่ามีผู้เล่นกี่คนที่ชนะเกม แต่ยังรวมถึงความเข้ากันได้ของผู้เล่นในทีมที่แตกต่างกัน (ความถี่ที่ผู้เล่นชนะเมื่อเข้าร่วม ผู้เล่นเฉพาะรายอื่น)

  1. กระดานคะแนนการจัดอันดับ (ฉันอาจจะใช้ระบบการจัดอันดับ Elo )
  2. หน้าสถิติสำหรับผู้เล่นทุกคนที่มีคะแนนชนะเกมสถิติเกมล่าสุดและผู้เล่นคนไหนที่เข้ากันได้มากที่สุด

ฉันสงสัยอย่างยิ่งว่าสิ่งเหล่านี้ส่วนใหญ่ละเมิดหลักการบางอย่างในการปรับฐานข้อมูลให้เป็นมาตรฐาน

การออกแบบฐานข้อมูล


ฉันคิดว่านี่เป็นคำถามที่ดีมาก ชอบที่จะเห็นโครงสร้างฐานข้อมูลปัจจุบันของคุณเป็นแผนภาพในคำถาม ไม่ใช่ทุกคนที่รู้จัก Schema Builder ของ Laravel กรณีการใช้งานอาจถูกทำให้เป็นเนื้อดีขึ้นดังนั้นเราจึงเข้าใจความต้องการที่แท้จริงของคุณ
candied_orange

ขอบคุณ @CandiedOrange มาก - ฉันได้เพิ่มโครงสร้างแผนภาพ DB และจะเพิ่มกรณีการใช้งานมากขึ้น :)
แดเนียล

เป็นการปรับปรุงที่ดี ฉันจะถูกต้องไหมถ้าสมมติว่าผู้เล่นแต่ละคนจะอยู่ในทีมเดียวในแต่ละครั้งและในเกมเดียวในแต่ละครั้ง? นอกจากนี้ผู้เล่นออกจากและกลับสู่ทีมเก่าโดยไม่รีเซ็ตข้อมูลสำหรับทีมนั้น?
candied_orange

@CandiedOrange ขั้นพื้นฐานเมื่อเราต้องการเล่นเกมเราพบผู้เล่น 4 คน (จากผู้เล่นทั้งหมด 12 คน) และสุ่มกลุ่มพวกเขาเป็นทีมที่ 2
Daniel

ฉันไม่สามารถบอกได้ว่าเป็นใช่หรือไม่ ฉันพยายามเข้าใจว่าเวลามีผลต่อการออกแบบของคุณอย่างไร
candied_orange

คำตอบ:


2

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

สำหรับปัญหาแรกนั้นไม่มีเทคนิคในฐานข้อมูลที่จะทำให้ / คีย์ผสมใด ๆ ได้รับการปฏิบัติใน OR หรือในลักษณะที่คุณกำลังมองหา แต่ถ้า DB ของคุณรองรับคุณสามารถสร้างฟังก์ชันgetPlayerTeams(player_id)เพื่อแค็ปซูล แบบสอบถาม

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

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

สคีมาที่เสนอ (ขออภัยไม่มีไดอะแกรม):

player
    id
    name
    created_on
    updated_on

player_rating_hist
    player_id (FK)
    rating
    rating_date

team
    id
    player1_id (FK)
    player2_id (FK)
    created_on
    updated_on

game
    id
    team1_id (FK)
    team2_id (FK)

team_game
    team_id (FK)
    game_id (FK)
    result
    score
    rating_change

team_rating_hist
    team_id (FK)
    rating
    rating_date

คำสั่ง:

--Results for the game, should only ever be two rows for any given game
SELECT * FROM team_game WHERE game_id = 101

--All results for a team
SELECT * FROM team_game WHERE team_id = 123456 

โครงสร้างนี้อนุญาตให้แยกเอนทิตี "ฐาน" (ผู้เล่นและทีม) ออกจาก "เนื้อหา" ที่เกิดขึ้นจากการที่ระบบทำงานตลอดเวลาและหมายความว่าคุณไม่ได้อัปเดตตารางฐานใดฐานหนึ่งด้วยอันดับปัจจุบัน # ของ win ฯลฯ เป็นค่าที่ได้มาและควรเรียกคืนโดยการให้คะแนนล่าสุดอันดับเฉลี่ยCOUNTของ win หรือ loss เป็นต้นหากระบบมีขนาดใหญ่พอคุณสามารถพิจารณาแยกข้อมูลรวมออกเป็น "คลังเก็บ" (แม้ว่าจะเป็นเพียงชุดของตารางที่แยกต่างหากในฐานข้อมูลเดียวกัน) เพื่อการวิเคราะห์ที่ง่ายขึ้น

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