SQL数据库:使用一个包含3,5M条目的表或使用条目较少的表吗?

问题描述:

我正在制作一个足球游戏,让人们可以在线创建联赛。SQL数据库:使用一个包含3,5M条目的表或使用条目较少的表吗?

说一段时间后我有1000个联赛。我将数据存储在SQL中。我应该:

1)创建1个与表“名册”单一数据库和所有联赛的所有球员插入它(这将接近3.5至4万个条目,1000个盟)

2 )创建1个20代表“rosters1,rosters2等”单个数据库和拆分那些20个表之间的联赛名册

3),用于在与表“名册”每个联盟创建1个数据库中的每个

4)创建20个数据库,每个数据库中有一个表“花名册”,并在20个数据库之间拆分联盟名册。

性能和快速SQL查询的最佳选择是什么?

+2

也许一些表格数据会有帮助,以及一个或两个查询。没有更具体的例子,很难用绩效来说。 – ansiart 2011-05-16 22:04:41

+2

3.5M没什么。保持关系简单(冗余是你的朋友)和表格苗条(冗余不是你的朋友)。重要的是你创建了正确的索引。以及使用这些索引的公用智能查询。相同的数据库或名字相同的表格很愚蠢。 3.5M没什么。 – Rudie 2011-05-16 22:44:13

+0

列的示例: PlayerID,PlayerName,PlayerTeam,PlayerAwareness,PlayerHitting,PlayerCatching ... PlayerContract,PlayerYearsLeft(共82列) @RUDIE:你是什么意思“创建正确的索引”?索引在表中的作用是什么(以及如何决定索引哪些列)?此外,下面的用户“我自己”在他的评论中说,3.5米将花费大量时间进行搜索。了解我的“名册”表(82列)的列,你还建议使用单个表吗?在此先感谢 – 2011-05-16 23:03:27

听起来你需要学习一些数据库基础知识,所以请花点时间确保你了解Database Normalizationindexes。然而,原则上,你可能需要一个“玩家”表(玩家ID,名字等),一个“名册”表(名册ID,名字,也许是owner_id)和一个player_roster_map(player_id,roster_id)将两者联系起来。您可能需要对player_id和roster_id的复合值进行唯一约束,并且您应该在该映射表中对player_id和roster_id都有外键约束。 (我假设球员并不是每个球员都是独一无二的;如果有属性被拥有球员的人所覆盖,那么你仍然可以进行类似的模拟,但是我猜根据我对你对球员的描述的理解该模型)

您的数据库引擎可能会将您标记为主键的任何内容编入索引,并且可能将您标记为外键的任何内容编入索引,但这依赖于数据库,并且我不是专家在MySql上;你需要做一些研究。

当您执行查询时,正确的索引将帮助您,插入性能方面的成本通常较低。如果最后得到大量相同的值或者查询的利用率很高(只有一小部分值(例如时间范围)),那么您最终可能还需要了解分区。分区使您可以获得处理大量记录的好处,而不会产生非规范化引入的建模问题。但是,不要过早地采取这一步骤;您可能会发现,正确的数据库设计对于您所暗示的数据集的大小已足够。

+0

感谢您的详细解答。然而,球员在联盟和联盟之间的演变是不同的,所以我必须为每个联盟中的每个球员插入一行 - 您提议的我的方案适合联盟,每个联盟中球员的属性不会改变,但这是不是这里的情况。然而,我仍然可以为球员信息提供一张不会改变的表格,例如名字+出生日期+国籍,但是它会对表现产生影响吗?我不太确定(每个联盟只有大约8行(玩家的个人信息)) – 2011-05-17 00:10:57

+0

我建议将属性作为玩家模型的一部分进行建模,作为正确性的第一步,然后担心表现。令人惊讶的是,正确性往往与表现有关。但这听起来像你有一个额外的领域概念来解决;这听起来像是一个PlayerLeagueVitals的概念,有player_league_id(PK),player_id,league_id和每个相关的联盟特定的球员统计。 – JasonTrue 2011-05-17 00:20:00

+0

辉煌。 (1)players_infos(包含名称和出生日期等固定元素...) (2)players_vitals(包含特定联盟的球员统计数据和球员的id以在必要时加入“players_infos” ) 我会把这个尝试;) – 2011-05-17 00:25:08

我想你想要选项1原则上。你必须考虑使用情况,例如将某个人从一个名单移到另一个名单:你不希望跨数据库发生这种情况。我想像你想要对阵所有名单的许多问题。尽管MySQL不提供它,但您可能会发现研究分区很有帮助。 (Postgresql的)

你还需要看看规范化。例如:我假设你有一个teams表,并且PlayerTeam只是一个外键(你应该在这两个表中将这个列索引)。如果这对您没有意义,请花一点时间在数据库设计书或网站上。

+0

我相信MySql的一些配置现在支持分区,但它可能取决于您的构建配置以及可能选择的存储引擎。 http://dev.mysql.com/doc/refman/5.1/en/partitioning.html – JasonTrue 2011-05-16 23:42:02

+0

@JasonTrue:很有可能。我对MySQL的熟悉程度很低,他们的ISAM表格非常多。 – 2011-05-16 23:45:17