针对成员数量有限的团队的MySQL表设计

针对成员数量有限的团队的MySQL表设计,mysql,database-design,Mysql,Database Design,我正在尝试设计一个数据库,其中包含一组团队,每个团队最多可以有5名成员。最大值可能会改变,但对于这个问题,5是可以的。目前它是在mysql中构建的,结构如下: 表格-小组 -teamid-主键 -[搜寻准则1] -[搜寻准则2] -[搜寻准则3] -[其他资料] 表-帐目 -accountid-主键 -[其他资料] 表-帐户成员资格 -teamid-主键、外键团队。teamid -accountid-主键,外键Accounts.accountid 系统将搜索符合3个标准的球队。如果它发现一个或多

我正在尝试设计一个数据库,其中包含一组团队,每个团队最多可以有5名成员。最大值可能会改变,但对于这个问题,5是可以的。目前它是在mysql中构建的,结构如下:

表格-小组 -teamid-主键 -[搜寻准则1] -[搜寻准则2] -[搜寻准则3] -[其他资料]

表-帐目 -accountid-主键 -[其他资料]

表-帐户成员资格 -teamid-主键、外键团队。teamid -accountid-主键,外键Accounts.accountid

系统将搜索符合3个标准的球队。如果它发现一个或多个匹配项尚未完全匹配,则会将用户添加到第一个匹配项中。否则,它将使用指定的条件创建一个新团队,并将用户添加为第一个成员

我知道如何编写查询来搜索团队,以及如何计算团队中的成员。但是,我担心,如果几个用户同时尝试此操作,我将得到成员数量不正确的团队。i、 e.2用户可能会搜索相同的标准,最终成为同一团队的第5名和第6名成员


是否有一种方法可以编写查询或重新构造数据库设计以防止竞争条件和/或以原子方式执行成员计数和成员更新?

您可以尝试锁定表,然后读取它,插入任何需要的内容,然后解锁表。通过这种方式,几个进程将在读取和插入它们自己之前等待对方完成,这样就避免了竞争。

uri2x的回答让我在一些新的地方搜索,我发现一个查询可以在一个操作中实现我想要的功能:

插入teammemberships帐户ID,teamid 选择“[帐户id]”,teams.teamid 来自团队 左加入团队成员 在teams.teamid=teammemberships.teamid上 其中[搜索条件] 按团队分组。teamid 拥有countteammemberships.teamid<5 限值1

此查询剩下的唯一问题是,如果某个帐户正在尝试加入另一个团队,并且其当前团队是该选择返回的团队,则他们将获得重复的主键错误,而不是添加到下一个可用团队。现在,我将用户限制在一个团队中,所以这应该是可以的

是否有一种方法可以编写查询或重新构造数据库设计以防止竞争条件和/或以原子方式执行成员计数和成员更新

不要使用锁表,使用Engine=InnoDB

如果需要更新两个表,请执行以下操作

BEGIN;
UPDATE table1 ...;
UPDATE table2 ...;
COMMIT;
并在每一步检查错误-死锁和其他错误可能会发生


如果您还需要在事务中选择,则可能需要选择。。。更新。

我看了一下锁表文档,我得出了以下结论:锁表团队阅读,团队成员身份写入;选择teams.*,countteammemberships.teamid作为membercount从团队左侧加入teams上的teammemberships.teamid=teammemberships.teamid,其中[criteria]按团队分组。teamid的membercount小于5;,在代码中选择适当的结果,插入到teammemberships accountid中,teamid值“[account id]”,“[selected team]”;解锁表格;这里唯一的问题是,其他尝试写入团队的操作失败,而不是阻塞。有办法吗?