วิธีการนำเอนทิตีไปใช้ด้วยจำนวนแอตทริบิวต์สูงสุดที่ไม่รู้จัก?


12

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

สำหรับผู้ที่ไม่คุ้นเคยกับเกมเบสบอลเกมมักจะมีเก้าโอกาสนานเว้นแต่เกมจะถูกผูกไว้เมื่อสิ้นสุดโอกาสที่ 9 เกมเบสบอลจึงมีความยาวไม่บึกบึนซึ่งหมายความว่าฉันไม่สามารถออกแบบฐานข้อมูลให้มีเพียง 9 คอลัมน์สำหรับการวิ่งที่ทำคะแนนในแต่ละโอกาส (ในทางเทคนิค 18 (9-9 อินนิ่ง * 2 ทีม) แนวคิดหนึ่งที่ฉันมีคือทำให้อนุกรมอาร์เรย์ และเข้ารหัสเป็น Base64 ก่อนเก็บไว้ในฐานข้อมูลอย่างไรก็ตามฉันไม่รู้ว่านี่เป็นเทคนิคที่ดีในการใช้หรือไม่และฉันสงสัยว่าใครมีความคิดที่ดีกว่า

ในกรณีที่มีความสำคัญฐานข้อมูลที่ฉันกำลังพัฒนาคือ PostgreSQL

ข้อเสนอแนะใด ๆ ที่ชื่นชมอย่างมาก! ขอบคุณ!

คำตอบ:


7

คุณสามารถทำได้ มันจะให้ประสิทธิภาพที่ดีสำหรับเกมที่มีระยะเวลาปกติในขณะที่ให้คุณจัดเก็บเกมที่ใช้เวลานาน

CREATE TABLE InningRuns (
    GameId INT NOT NULL REFERENCES [...],
    Team CHAR(4) NOT NULL, --'Home','Away'
    Inning1 TINYINT, --Seeing how more than 255 runs are not really possible in an inning
    Inning2 TINYINT,
    [...],
    Inning9 TINYINT,
    ExtraInnings XML | TINYINT[] | VARBINARY | ETC., --Use to hold any runs in extra innings.
    PRIMARY KEY (GameId, Team)
)

คุณสามารถทำให้เป็นมาตรฐานและมีแถวสำหรับชุดค่าผสมที่ไม่ซ้ำกันของเกมทีมและโอกาส สิ่งนี้จะทำให้คุณมีโอกาสมากเท่าที่ประเภทข้อมูล InningId จะอนุญาต

CREATE TABLE InningRuns (
    InningRunId INT IDENTITY PRIMARY KEY,
    GameId INT NOT NULL REFERENCES [...],
    Team CHAR(4) NOT NULL, --'Home','Away'
    InningId TINYINT, --Seeing how more than 255 innings might be excessive
    Runs TINYINT,
    UNIQUE (GameId, Team, InningId)
)

แก้ไข : ฉันรู้ว่า PostgreSQL ใช้ลำดับแทนตัวตนฉันไม่จำไวยากรณ์ที่ถูกต้องออกจากมือดังนั้นแปลตามนั้น


ฮ่าฮ่าฉันชอบที่ฉันตั้งใจจะไม่อ่านคำตอบของคุณจนกว่าฉันจะเขียนของฉันและเราก็ใกล้เคียงกับคนอื่นมาก ดี
jcolebrand

ขอบคุณสำหรับคำตอบนี้มันสมเหตุสมผลแล้วฉันจะใช้ schema คะแนนกล่องได้อย่างไร
Philip Lombardi

4

ฉันไม่คิดว่าจะมีอะไรผิดปกติเพียงแค่มีคอลัมน์

inning_score int[]

สำหรับ 1 ถึง 9 ขึ้นไป นั่นเป็นหนึ่งในไม่กี่แห่งที่การใช้อาร์เรย์อาจสมเหตุสมผล


3

ดังนั้นสิ่งที่ฉันเห็นที่นี่เป็นสิ่งที่ขัดแย้งเล็กน้อยเพราะโอกาสไม่ได้เป็นคุณลักษณะของเกมโดยตรงยกเว้นทางอ้อม แต่นั่นอาจเป็นเพียงฉัน ฉันจะแนะนำบางอย่างเพิ่มเติมเช่นตาราง RunsScored และให้มันเชื่อมโยงกลับไปที่ตาราง GamesHeader บางประเภทดังนั้นควรพิจารณา:

CREATE TABLE GamesHeader (
    GameID     INT IDENTITY(1,1),
    HomeTeamID INT,  --FK to teams table, naturally
    AwayTeamID INT,  --FK to teams table, naturally
    FinalInningsCount BYTE,  -- for faster reporting after the game is over
    FinalHomeScore BYTE,     -- for faster reporting after the game is over
    FinalAwayScore BYTE,     -- for faster reporting after the game is over
    --Other attribs
)

CREATE TABLE RunsScored (
    RunsScoredID BIGINT IDENTITY(1,1), -- for faster reverse traversal, possibly. May not be needed, this depends on your setup, as the normalization will show a composite key anyways
    PlayerID INT,   --FK to players table naturally
    GameID INT,     --FK to GamesHeader table naturally
    Inning BYTE, --wait for the payoff
    RunsEarned,     --because you may want to track this by the player ... really the problem is that there's not a single naturalized setup for this, so you may be intersecting this table to another stats table elsewhere. idk, it depends on your model. I'm going for fairly simplistic atm. Wanted to demonstrate something else entirely, but this needs to be accounted for.
     -- other attribs
)

SELECT MAX(r.Inning) FROM RunsScored r JOIN GamesHeader g ON g.GameID = r.GameID WHERE GameID = 'x'

นั่นจะทำให้คุณได้รับโอกาสสูงสุดในการเล่นเกมและคุณสามารถปรับแต่งโดย PlayerID -> TeamID เพื่อหารายละเอียดเพิ่มเติมหากคุณต้องการ สิ่งเหล่านั้นอาจเป็นฉันไม่แน่ใจ

ฉันอาจจะปรับแต่งตารางที่สองนั้นไม่ใช่ RunsScored แต่มีบางอย่างเกี่ยวกับ AtBat เพราะนั่นคือสิ่งที่คุณกำลังติดตาม ฉันแค่ต้องการแสดงให้คุณเห็นว่าคุณสามารถลดโอกาสในการทำให้โอกาสออกจากโต๊ะเกมเป็นปกติได้อย่างไร ฉันจะปรับแต่งโมเดลของฉันให้ลื่นไหลแบบนี้เป็นโครงการของฉัน HTH YMMV

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

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