在数据库中的大量列

lov*_*e33 2 sql database

我一直在研究这个问题,但仍未能做出令人满意的决定.

这个问题最接近,但仍然没有真正帮助我的情况. MySQL数据库中的大量列

我基本上创建了一个"谁将赢得战斗"的网站,以解决长期存在的蝙蝠侠与超人风格的争论,用户可以投票决定他们认为谁会赢.

用户可以选择向网站提交"战斗机",然后随机匹配其他战斗机以供将来用户投票.

我希望显然保持所有比赛的统计数据以显示给用户.

现在我将有一个名为LetHTERS的表.这将存储主键,名称,描述等信息,但不存储战斗结果.

至于存储战斗结果,我可以看到两个选项.

选项A:为每个战斗机创建一个表,以计算他们与其他战斗机主键相比的获胜选票数量.

选项B:创建一个大的投票表,其中有相同数量的列和行由战斗机的主键索引.然后例如为了获得战斗机1对战斗机4的统计数据,我将查询第1行(战斗机1 PK1)第4列(战斗机4 PK4)获得战斗机1胜对战斗机4的数量,然后重复但查询第4行(PK4为战斗机4),第1列获得战斗机4胜vs战斗机1.当添加数百(数千?)个战斗机时,这个表显然会变得非常大.

(希望这不是太混乱!)

所以我想我的问题是,拥有数百个小表(在添加新战斗机时都需要添加列和行)会更好.或者有一张大桌子?

我完全是50/50,所以请任何建议或其他方式,我可以实现这将是非常感谢.

提前致谢.

编辑:很抱歉将此删除.我想到的投票基本上可以作为每个战斗机的总票数,有利于赢得战斗对战彼此.

Mar*_*ith 5

在澄清后我会考虑

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)

但由于业绩原因,可能会保持非规范化的投票总数.

  • 这听起来可行.希望这个网站取得巨大成功,所以我们终于可以得到[Gorilla vs. Shark]的答案(http://blog.stackoverflow.com/2011/08/gorilla-vs-shark/).:) (4认同)
  • 您是否需要为每个战斗机保持单独的投票轨道? (3认同)