我正在建立一个允许人们在线创建联赛的足球比赛。
说我有一段时间后有1000个联赛。我将数据存储在SQL中。我应该:
1)创建1个单独的数据库,其中包含“rosters”表格,并将所有联赛中的所有玩家都插入其中(1000个联赛的参赛人数约为3,500万到400万)
2)创建一个包含20个表“rosters1,rosters2等”的单个数据库,并在这20个表之间拆分联盟名单
3)为每个联赛创建1个数据库,每个
中有一个“名单”4)创建20个数据库,每个数据库中有一个表“名单”,并在20个数据库之间拆分联盟名册。
性能和快速SQL查询的最佳选择是什么?
答案 0 :(得分:1)
我认为你原则上要选择1。您必须考虑将某人从一个名单移到另一个名单的用例:您不希望在数据库之间发生这种情况。我想象你想对所有名册进行许多查询。您可能会发现研究分区很有帮助,即使MySQL没有提供它。 (Postgresql确实。)
您还需要查看规范化。示例:我假设您有一个teams
表,而PlayerTeam只是一个外键(您应该在两个表BTW中索引此列)。如果这对您没有意义,请花一点时间在数据库设计书籍或网站上。
答案 1 :(得分:1)
首先,您需要学习一些数据库基础知识,因此请花一些时间确保您理解Database Normalization和indexes。
但是,原则上,你可能需要一个“玩家”表(玩家ID,名称等),一个“名册”表(名册id,名称,也许是owner_id),以及一个链接的player_roster_map(player_id,roster_id)他们俩。您可能希望对player_id和roster_id的复合值有一个唯一约束,并且您应该在该映射表中的player_id和roster_id上都有一个外键约束。
(我假设玩家并不是每个阵容都是独一无二的;如果有属性被拥有者所覆盖的人覆盖,你仍然可以进行类似的模拟,但我猜是基于我对你的描述的理解模型。)
您的数据库引擎可能会将您标记为主键的任何内容编入索引,并且可以将您标记为外键的任何内容编入索引,但这与数据库有关,我不是MySql的专家。你需要做一些研究。
正确的索引可以帮助您执行查询,在插入性能方面成本通常很低。如果您最终得到大量相同的值或查询的高利用率,其中只有一小部分值(例如时间范围),您最终也可能需要了解分区。通过分区,您可以获得处理大量记录的好处,而不会出现非规范化引入的建模问题。但是,不要过早地采取这一步骤;您可能会发现正确的数据库设计足以满足您所暗示的数据集大小。