我一直在研究这个问题,但仍未能做出令人满意的决定.
这个问题最接近,但仍然没有真正帮助我的情况. MySQL数据库中的大量列
我基本上创建了一个"谁将赢得战斗"的网站,以解决长期存在的蝙蝠侠与超人风格的争论,用户可以投票决定他们认为谁会赢.
用户可以选择向网站提交"战斗机",然后随机匹配其他战斗机以供将来用户投票.
我希望显然保持所有比赛的统计数据以显示给用户.
现在我将有一个名为LetHTERS的表.这将存储主键,名称,描述等信息,但不存储战斗结果.
至于存储战斗结果,我可以看到两个选项.
选项A:为每个战斗机创建一个表,以计算他们与其他战斗机主键相比的获胜选票数量.
选项B:创建一个大的投票表,其中有相同数量的列和行由战斗机的主键索引.然后例如为了获得战斗机1对战斗机4的统计数据,我将查询第1行(战斗机1 PK1)第4列(战斗机4 PK4)获得战斗机1胜对战斗机4的数量,然后重复但查询第4行(PK4为战斗机4),第1列获得战斗机4胜vs战斗机1.当添加数百(数千?)个战斗机时,这个表显然会变得非常大.
(希望这不是太混乱!)
所以我想我的问题是,拥有数百个小表(在添加新战斗机时都需要添加列和行)会更好.或者有一张大桌子?
我完全是50/50,所以请任何建议或其他方式,我可以实现这将是非常感谢.
提前致谢.
编辑:很抱歉将此删除.我想到的投票基本上可以作为每个战斗机的总票数,有利于赢得战斗对战彼此.
在澄清后我会考虑
CREATE TABLE FightResults
(
Fighter1Id INT REFERENCES FIGHTERS(FighterId),
Fighter2Id INT REFERENCES FIGHTERS(FighterId),
Fighter1Votes INT,
Fighter2Votes INT,
CHECK (Fighter1Id < Fighter2Id ),
PRIMARY KEY (Fighter1Id,Fighter2Id)
)
Run Code Online (Sandbox Code Playgroud)
每场比赛都有一排.Gorilla vs Shark,Lion vs Tiger等.检查和PK约束确保同一场比赛不会多次出现.
这确实假设战斗将有两个固定数量的参与者.如果不是这种情况,那么更灵活的架构就是
CREATE TABLE Fight
(
FightId INT PRIMARY KEY,
/*Other columns with fight metadata*/
)
CREATE TABLE FightResult
(
FightId INT REFERENCES Fight(FightId),
FighterId INT REFERENCES FIGHTERS(FighterId),
Votes INT,
PRIMARY KEY (FightId,FighterId)
)
Run Code Online (Sandbox Code Playgroud)
但这确实增加了查询的不必要的复杂性.
您可能还希望防止同一用户对同一竞赛进行多次投票.在这种情况下,你可能会使用类似的东西(假设每场比赛两架战士)
CREATE TABLE Fights
(
FightId INT PRIMARY KEY,
Fighter1Id INT REFERENCES FIGHTERS(FighterId),
Fighter2Id INT REFERENCES FIGHTERS(FighterId),
CHECK (Fighter1Id < Fighter2Id )
)
CREATE TABLE Votes
(
FightId INT REFERENCES Fights(FightId),
UserId INT REFERENCES Users(UserId),
Vote INT CHECK (Vote IN (1,2)),
PRIMARY KEY (FightId,UserId)
)
Run Code Online (Sandbox Code Playgroud)
但由于业绩原因,可能会保持非规范化的投票总数.