在数据库中的大量列

时间:2013-10-26 22:45:02

标签: sql database

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

这个问题最接近,但仍然没有真正帮助我的情况。 Large Number of Columns in MySQL Database

我基本上创建了一个“谁将在战斗中获胜”的网站,以解决长期存在的蝙蝠侠与超人风格的争论,用户可以对他们认为谁将赢得胜利进行投票。

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

我希望显示所有匹配的统计信息以显示给用户。

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

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

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

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

(希望这不是太混乱!)

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

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

提前致谢。

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

2 个答案:

答案 0 :(得分: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)    
)

每场比赛你都有一排。大猩猩对鲨鱼,狮子对老虎等。检查和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)
)

但这确实增加了查询的不必要的复杂性。

您可能还希望防止同一用户对同一竞赛进行多次投票。在这种情况下,你可能会使用类似的东西(假设每场比赛两架战士)

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)   
)      

但出于表现原因,可能会保持非规范化投票总数。

答案 1 :(得分:3)

解决方案是创建2个表:

  1. 使用FighterId(主键)和所有其他数据的战士。

  2. FightResult:FightResultId(主键),FighterId1,FighterId2,FightResult。两列FighterIdX是战斗机的外键。

  3. 这样可以轻松查询和添加投票,并使其简单易懂。

    如果您愿意,您还可以向第二个表格中添加用于打斗的用户(用户的外键)等信息。