gpt4 book ai didi

sql - 数据库中的大量列

转载 作者:搜寻专家 更新时间:2023-10-30 19:57:46 25 4
gpt4 key购买 nike

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

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

我基本上是在创建一个“谁会在战斗中获胜”的网站,以解决长期存在的 bat 侠与超人风格的争论,用户可以在该网站上投票选出他们认为会赢的人。

用户可以选择向网站提交一名“斗士”,然后将其随机匹配到其他所有斗士,供 future 用户投票。

显然,我想保留所有比赛的统计数据以显示给用户。

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

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

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

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

(希望这不会太困惑!)

所以我想我的问题是,拥有数百个小表格是否更好(添加新战士时都需要添加列和行)。还是要一张大 table ?

我对此完全赞成 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)
)

每场比赛都有一行。 gorilla vs 鲨鱼、狮子 vs 老虎等。检查和 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)
)

但出于性能原因,可能会保留非规范化的投票总数。

关于sql - 数据库中的大量列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19612697/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com