如何实现最大属性数未知的实体?

Phi*_*rdi 12 schema postgresql database-design

我正在设计一个棒球模拟程序,但在设计 boxscore 模式时遇到了问题。我的问题是我想跟踪每局得分的次数。我在实际程序中这样做的方法是使用一个动态数组,该数组随着每局比赛而增长。

对于那些不熟悉棒球比赛的人来说,比赛通常是九局,除非比赛在第 9 局结束时仍然打平。因此,棒球比赛的长度不确定,这意味着我不能将数据库设计为每局得分只有 9 列(技术上是 18(9 局 * 2 队)。我的一个想法是序列化数组并将其编码为 Base64,然后再将其存储在数据库中。但是,我不知道这是否是一种很好的技术,我想知道是否有人有更好的主意。

如果重要,我正在开发的数据库是 PostgreSQL。

任何建议都非常感谢!谢谢!

Eri*_*elp 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)
)
Run Code Online (Sandbox Code Playgroud)

您可以进一步规范化,并为游戏、团队和局的每个独特组合排成一行。这将允许您使用 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)
)
Run Code Online (Sandbox Code Playgroud)

编辑:我知道 PostgreSQL 使用序列而不是 IDENTITY,我不记得正确的语法,所以相应地翻译。