我正在使用Sqlite3。
我有一个表'Team',它有一个可以为空的'Player'列表。
每个'Player'都是一个唯一的id,它是另一个表'Player'的外键。
每个'团队'最多可以有10个玩家。
每个“玩家”的名字都是这样的:
"CREATE TABLE IF NOT EXISTS "
"Team"
"("
"TeamID varchar(64) PRIMARY KEY,"
"UserID varchar(64) NOT NULL,"
"League varchar(255) NOT NULL,"
"PlayerID_1 varchar(64),"
"PlayerID_2 varchar(64),"
"PlayerID_3 varchar(64),"
"PlayerID_4 varchar(64),"
"PlayerID_5 varchar(64),"
"PlayerID_6 varchar(64),"
"PlayerID_7 varchar(64),"
"PlayerID_8 varchar(64),"
"PlayerID_9 varchar(64),"
"PlayerID_10 varchar(64),"
"FOREIGN KEY (UserID) REFERENCES User(UserID),"
"FOREIGN KEY (PlayerID_1) REFERENCES Player(PlayerID),"
"FOREIGN KEY (PlayerID_2) REFERENCES Player(PlayerID),"
"FOREIGN KEY (PlayerID_3) REFERENCES Player(PlayerID),"
"FOREIGN KEY (PlayerID_4) REFERENCES Player(PlayerID),"
"FOREIGN KEY (PlayerID_5) REFERENCES Player(PlayerID),"
"FOREIGN KEY (PlayerID_6) REFERENCES Player(PlayerID),"
"FOREIGN KEY (PlayerID_7) REFERENCES Player(PlayerID),"
"FOREIGN KEY (PlayerID_8) REFERENCES Player(PlayerID),"
"FOREIGN KEY (PlayerID_9) REFERENCES Player(PlayerID),"
"FOREIGN KEY (PlayerID_10) REFERENCES Player(PlayerID)"
");";
我的问题是,如何轻松地将新的“播放器”插入表格?我需要一种方法迭代表中的每个当前'Player',找到第一个NULL列。
我正在使用来自C的这个数据库接口,并且用一个查询将表放入内存并不是那么困难,在内存中迭代它以找到第一个NULL'Player',并在那里插入新的,但这似乎效率极低!
另外,如果设计不好,请随意提出更好的设计!我仍然是数据库设计的新手。
答案 0 :(得分:2)
我不会使用那种设计,如果你对你的桌子进行规范化以便你拥有"播放器"那会更好。表参考"团队"表告诉某个玩家属于哪个队伍。
然后,向团队添加新玩家只需向"玩家"添加新行。表
让玩家切换球队,甚至移除球员也更容易。
您可以从应用程序中控制每个团队10名玩家的限制(在添加新玩家之前,检查团队已有多少玩家)。
或者你可以创建一个触发器,如果在Player表中添加一行会导致团队中有超过10名玩家,则会引发错误。
"CREATE TABLE IF NOT EXISTS "
"Team"
"("
"TeamID varchar(64) PRIMARY KEY,"
"UserID varchar(64) NOT NULL,"
"League varchar(255) NOT NULL,"
"FOREIGN KEY (UserID) REFERENCES User(UserID)"
");";
"CREATE TABLE IF NOT EXISTS "
"Player"
"("
"PlayerID varchar(64) PRIMARY KEY,"
"TeamID varchar(64) NOT NULL,"
"PlayerName varchar(255) NOT NULL,"
"FOREIGN KEY (TeamID) REFERENCES Team(TeamID)"
");";
修改强>
如果同一个玩家可以在多个团队中,那么您需要第三个表来将玩家映射到团队。
然后,每个玩家只能存在一次,但是你可以通过在" PlayerToTeam"中添加多行来将同一玩家映射到多个团队。表
这样的事情:
"CREATE TABLE IF NOT EXISTS "
"Team"
"("
"TeamID varchar(64) PRIMARY KEY,"
"UserID varchar(64) NOT NULL,"
"League varchar(255) NOT NULL,"
"FOREIGN KEY (UserID) REFERENCES User(UserID)"
");";
"CREATE TABLE IF NOT EXISTS "
"Player"
"("
"PlayerID varchar(64) PRIMARY KEY,"
"PlayerName varchar(255) NOT NULL,"
");";
"CREATE TABLE IF NOT EXISTS "
"PlayerToTeam"
"("
"PlayerID varchar(64) NOT NULL,"
"TeamID varchar(64) NOT NULL,"
"PRIMARY KEY (PlayerID, TeamID),"
"FOREIGN KEY (PlayerID) REFERENCES Player(PlayerID),"
"FOREIGN KEY (TeamID) REFERENCES Team(TeamID)"
");";