【问题标题】:Table structure in mySQLmySQL中的表结构
【发布时间】:2013-08-22 23:27:09
【问题描述】:

我正处于使用 MySQL 和 PHP 创建数据库的早期阶段,希望得到一些建议。我已经开始整理数据,并想开始将其输入到准备导入我的表中的 .csv 文件中。在此之前,我不确定如何正确布局结构化的列和表。

好的,我会尽力说明我要创建的内容。我有我的主页结构,您可以在其中选择按赛季或 A-Z 历史球员名单选择球员名单。一旦您从玩家列表中单击特定玩家,它会在他们的玩家资料中显示如下内容:http://stats.touch-line.com/playerdet.asp?playerid=41472&cust=2&lang=0&FromSTR=TRUE&compid=&teamid=1&H2H=

我需要创建多少张表?

具有playerID、playerName、playerDOB、playerBirthplace、playerPosition等的player table。

包含teamID、teamName、teamNickname、teamGround、teamFounded等的团队表

包含seasonID、playerID、teamID、playerApps、playerGoals的赛季表?

或者有没有更快、更有效的方法,而不需要使用这么多的表来链接数据?任何建议将不胜感激。提前致谢。 ;)

【问题讨论】:

  • 您有一个良好的开端,但请考虑playerPosition 可能会在球员的职业生涯中甚至在一个赛季内发生变化。第 1 队的“中锋”,第 2 队的“守门员”,以及第 3 队的“替补球员”。
  • @MarcB 谢谢马克。 ;) 除了 playerPosition,我只是想找出最有效的数据组合方式。理想情况下,在球员资料上应该有 SEASON |团队名称 |应用程序 |目标,但我不确定如何将数据存储在表中。有这么多条目,它会有效地运行吗?还是我需要为每个季节创建一个表格?
  • SQL 数据库在包含数百万行的表上高效运行,因此不必担心“条目太多”。不过,重要的是让数据结构正确。

标签: php mysql database database-design


【解决方案1】:

我需要创建多少张表?

简短的回答是:每个“实体”类型对应一个表。实体可以定义为人、地点、事物、概念或事件,它们可以被唯一标识,对企业感兴趣,并且我们可以存储相关信息。

数据库设计的一个关键是数据分析(Richard Perkinson “数据分析:数据库设计的关键”,QED c.1993)

您已经确定了模型中的一些重要实体:球员、球队、赛季。可能还缺少一些其他关键实体,稍后可能会发现。

每个实体的属性需要被识别,并且应该依赖于实体的键,而不是其他的键。 (每个属性都应该依赖于键,整个键,只有键,所以帮帮我 Codd。)

您还需要确定实体之间存在的关系。一名球员可以是多个球队的成员吗?一名球员可以拥有多个位置吗?如果一名球员被交易(从一支球队转移到另一支球队),这将如何在模型中表示?

当我们遇到“多对多”关系时,它们会在单独的关系表中表示。重复的属性也会被分成单独的子表。

在开始将多个实体组合到同一个表中之前,确保模型正确非常重要。优化通常会导致模型损坏;它通常不会修复不起作用的模型。

当查询符合模型时,数据库旨在高效处理大量行。有几十个表的数据库可以非常高效地运行,并且比表较少的数据库运行效率更高。

我更关心获得一个有效的数据库设计,而不是优化一个不起作用的设计。

【讨论】:

  • 不错的答案!你能澄清一下“属性应该依赖于键”是什么意思吗?
  • @ravloony:我们需要确保存储在列中的值由表的键确定,以避免冗余和更新异常。例如,我们不希望将team 的属性存储在player 表中,因为它会为团队中的每个玩家重复。 (那个例子不是很好,因为它很明显。)另一个例子,dateJoinedTeam 并不是player 的一个属性,它实际上是playerteam 之间关系的一个属性。这是一个处理所有需要的专栏并回答正确问题的过程。
  • 作为 OP 列的示例,playerPosition 是玩家的属性(如 DOB 和 Birthplace 是),还是 player 和 @987654329 之间关系的属性@。 player 可以是一支球队的一线前锋,而另一支球队的二线后卫吗? (我没有这个问题的答案,但是有一个答案,例如“一名球员只有一个位置,不多也不少,并且与他们所在的球队无关”与“一名球员可以持有超过一个职位,在同一个团队”。
  • @spencer7593 您好,感谢您的回答。我开始更多地了解结构。在这种情况下,球员一次只能为一支俱乐部球队效力,并且通常只能在一个位置上踢球。这比任何事情都令人沮丧,因为我确切地知道我想要什么样的布局,但我无法将其付诸实践。我将不得不做更多的研究,然后一旦我在正确的列和表中获得了一些示例数据......尝试编写一些 PHP 脚本来显示它!深呼吸!再次感谢。 :)
  • @julescoco:这个想法是将“交易数据”存储在最低、最原子的层:在这种情况下,它将在每个游戏的级别。您将有一个表格,其中每一行描述一个游戏:团队 a、团队 b、日期和有关游戏本身的其他原子数据。然后你会有另一个表格,其中每一行都描述了一名球员在该比赛中的角色:球员的 ID、比赛的 ID、他效力的球队、他的位置、他进了多少球、他上场了多少分钟,等等。这个允许您以最灵活的方式汇总数据。不用担心会有数千行!
猜你喜欢
  • 2010-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-23
  • 2013-02-04
  • 1970-01-01
  • 1970-01-01
  • 2012-12-30
相关资源
最近更新 更多