具有多对多关系的应用程序的数据库结构?

时间:2016-01-02 03:08:54

标签: sql sql-server database

我正在创建一个Web应用程序来跟踪Foosball分数。我为我的项目创建了基本模式,如下所示:

CREATE TABLE Organization(
  OrganizationID INT IDENTITY(1,1) PRIMARY KEY,
  Name NVARCHAR(MAX) NOT NULL
);

CREATE TABLE Player(
  PlayerID INT IDENTITY(1,1) PRIMARY KEY,
  Username NVARCHAR(MAX) NOT NULL,
  Password NVARCHAR(MAX) NOT NULL,
  FirstName NVARCHAR(MAX) NOT NULL,
  LastName NVARCHAR(MAX) NOT NULL,
  Email NVARCHAR(MAX) NOT NULL,
  OrganizationID INT NOT NULL REFERENCES Organization(OrganizationID)
);

CREATE TABLE Team(
    TeamID INT IDENTITY(1,1) PRIMARY KEY
);

CREATE TABLE TeamPlayerXRef(
    TeamID INT NOT NULL,
    PlayerID INT NOT NULL,
    CONSTRAINT PK_TeamPlayerXRef PRIMARY KEY(TeamID, PlayerID),
    CONSTRAINT FK_TeamPlayerXRef_TeamID 
        FOREIGN KEY(TeamID) REFERENCES Team(TeamID),
    CONSTRAINT FK_TeamPlayerXRef_PlayerID 
        FOREIGN KEY(PlayerID) REFERENCES Player(PlayerID)
);

CREATE TABLE Game(
    GameID INT IDENTITY(1,1) PRIMARY KEY
);

CREATE TABLE GameTeamXRef(
    GameID INT NOT NULL,
    TeamID INT NOT NULL,
    Score INT NOT NULL,
    CONSTRAINT PK_GameTeamXRef PRIMARY KEY(GameID, TeamID),
    CONSTRAINT FK_GameTeamXRef_GameID
        FOREIGN KEY(GameID) REFERENCES Game(GameID),
    CONSTRAINT FK_GameTeamXRef_TeamID 
        FOREIGN KEY(TeamID) REFERENCES Team(TeamID)
);

CREATE TABLE Match(
    MatchID INT IDENTITY(1,1) PRIMARY KEY
);

CREATE TABLE MatchGameXRef(
    MatchID INT NOT NULL,
    GameID INT NOT NULL,
    CONSTRAINT PK_MatchGameXRef PRIMARY KEY(MatchID, GameID),
    CONSTRAINT FK_MatchGameXRef_MatchID
        FOREIGN KEY(MatchID) REFERENCES Match(MatchID),
    CONSTRAINT FK_MatchGameXRef_GameID
        FOREIGN KEY(GameID) REFERENCES Game(GameID),
);

通过这种设置,我可以让一个玩家加入多个团队(双打),或者一个团队自己(单打)。然后匹配可以分配多个游戏,这对于匹配的游戏数量根据组织而变化很有用(最好的3个,最好的5个,最好的x个)。

我的问题是:使用Team,Game和Match,我需要可以创建的唯一ID,以便可以在各自的XRef表中使用它们,但除了这些表中的ID之外,我真的没有任何其他数据。这是正确的做法吗?或者是否有更好的方法来获取这些表的唯一ID(通过我的应用程序动态创建它们?),这样我就不必只有一个带ID的表?

1 个答案:

答案 0 :(得分:2)

您的模型已适当规范化,并强制执行适当的RI。我可以理解,拥有一个表的唯一目的是生成一个ID似乎是“无用的”,但这个ID是允许你强制执行正确的RI的组成部分。我们称之为“关系型”数据库是有原因的,它应该显示关系。您已正确建模了玩家/团队,游戏/团队和比赛/游戏之间的M:M关系。您可能会听到一些Web或UI开发人员告诉您在业务层中生成GUID“更容易”,但您的数据库RI将是成本......不要转向黑暗面:))

作为一名体育迷,我试图模拟一些体育,“游戏”相关场景。我可能会建议在Game / Team Xref上添加“opponent”列。在您的设计中,每场比赛将有2行,但将此表中的TeamId视为“THE”团队,然后添加一个TeamId_Opponent来代表他们的对手。 “规范化直到它受到伤害,然后反规范化直到它起作用”......你可能会在查询时发现它很有用。您也可以使用相同的易用性添加OpponentScore,然后将Result派生为持久计算机列。

相关问题