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

Sql 如何管理表中的外键列表?,sql,sqlite,iterator,foreign-keys,Sql,Sqlite,Iterator,Foreign Keys,我正在使用Sqlite3 我有一个表“Team”,其中有一个可为空的“Player”列表 每个“玩家”都是一个唯一的id,它是另一个表“玩家”的外键 每个“团队”最多可拥有10名“球员” 每个“玩家”的名称如下: "CREATE TABLE IF NOT EXISTS " "Team" "(" "TeamID varchar(64) PRIMARY KEY," "UserID varchar(64) NOT NULL," "League varchar(255) NOT NULL," "Play

我正在使用Sqlite3

我有一个表“Team”,其中有一个可为空的“Player”列表

每个“玩家”都是一个唯一的id,它是另一个表“玩家”的外键

每个“团队”最多可拥有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)"
");";
 "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)"
 ");";
我的问题是,如何轻松地将新的“玩家”插入表中?我需要一种迭代表中每个当前“Player”的方法,以找到第一个空列

我正在从C与这个db进行接口,通过查询将表放入内存,在内存中迭代它以找到第一个空的“Player”,并在那里插入新的一个,这并不是很难,但这似乎效率极低


此外,如果这是设计不好,请随时提出一个更好的!我对db设计还是相当陌生。

我不会使用这种设计,最好是规范化您的表,以便让“玩家”表引用“团队”表来告诉给定玩家属于哪个团队

然后,向团队中添加一个新玩家只需在“玩家”表中添加一行即可

让一名球员换队,甚至换下一名球员也更容易

您可以通过应用程序控制每个团队10名球员的限制(在添加新球员之前,请检查该团队已有多少球员)

或者,您可以创建一个触发器,如果向玩家表中添加一行会导致团队中有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,"
"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)"
");";
 "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)"
 ");";

如果每个用户可以拥有多个团队,而一些团队将共享相同的玩家,这难道不是多余的吗?我需要为每个团队创建一个新的玩家,所以如果5个用户拥有相同的玩家,我需要5个相同的副本,只是使用不同的外键。他们可能都有相同的球员ID,我不认为同一个球员会出现在不同的球队。我在回答中增加了第二部分来处理那个案子。谢谢!这是一个更好的设计。正如我所说,我对设计db模式还比较陌生,PlayerTeam的中间层非常有用,因为我在其他几个表上也会遇到同样的问题。再次感谢!是的,这个设计很糟糕。player[[xyz]基本上是一个数组,FKs也是。在建模语言中:它是一个重复组。相同的构造函数适用于player1…player10,您必须复制它们。另外:您如何避免player1 player2,等等?[45个约束…]