如何管理表中的外键列表?

时间:2015-09-27 18:47:10

标签: sql sqlite iterator foreign-keys

我正在使用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',并在那里插入新的,但这似乎效率极低!

另外,如果设计不好,请随意提出更好的设计!我仍然是数据库设计的新手。

1 个答案:

答案 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)"
 ");";