数据库Newb - 主键,外键,没有键?

时间:2012-10-31 23:57:36

标签: mysql foreign-keys primary-key

我是一所大学的二年级计算机科学专业的学生。我正在用php / mySQL制作一个在线应用程序。这是我第一次使用PHP和mySQL。无论如何,我正在制作一个跟踪棒球比赛的应用程序。用户创建一个玩家团队并开始与另一个团队进行游戏,用户在应用评分游戏时输入结果并保持玩家统计数据。我正在设计数据库,并希望有人能为我澄清:

主键 - 我很确定我明白这是什么。基本上它是每行的唯一标识符,用于区分每一行。

外键 现在我有一个“玩家”表,我还有一个“PlayerStats”表。如果我理解正确(我可能没有),“Players”表有一个“playerStatsId”列,它是“PlayerStats”表的主键。这是有效的,因为每个玩家只有一个统计表。

没有钥匙??? - 好的,这就是我的榜样。我的应用程序的每个用户都应该能够根据需要向数据库添加任意数量的团队。他们只能编辑他们“拥有”的团队的游戏。我想我可以通过一个包含两列的表来实现这一目标:“username”和“teamId”。然后我可以搜索表格并挑选出属于某个用户的团队。我觉得这不是答案,因为它看起来效率不高。还有更好的方法吗?

我很感激任何帮助!谢谢!!

2 个答案:

答案 0 :(得分:1)

外键

每个播放器的PlayerStats表中只有1条记录吗?如果是这样,那么为什么不把统计数据放在玩家表中呢?

如果每个玩家有多个统计数据,通常我们会将统计数据分成不同的表格。

示例:

Players
PlayerID  Name
001       George

PlayerStats
PlayerID  StatType        Value
001       BattingAverage  0.300
001       RunsPerGame     2

在这种情况下,PlayerID将是PlayerStats表上的外键。这种表有时被称为业务应用程序的“详细信息”表。

你的无钥匙的例子很好,很常见。我不记得它叫什么,就像“关系表”。

答案 1 :(得分:0)

播放器表应该将PlayersStats表中的PK作为FK。您可以通过任何一种方式将其联系起来,但让玩家的某个方面成为关系的外键方面更有意义。

就“无钥匙”而言,你应该尽量避免这种情况。在关系数据库中,如果存在关系,则应该明确说明。你可以避免以这种方式使用孤立行。一个孤儿行基本上是一段数据,通过没有任何关系,可以永远坐下来,混乱你的Db。在这种情况下,您的User表应该具有PK,并且PK应该是将其链接到Teams表的内容。您可以有两列,但其中一列应与用户表相关。你的Team表也应该在任何玩家的桌子上都有一个PK作为FK,因为这些玩家属于团队。

我也会Key the Team表。您永远不应该假设数据库已经完成,即使它是您自己的。编写代码/数据库,意图扩展它们。

我相信还有很多其他内容。但这些是一些让你入门的一般要点。

编辑:

在您的问题中查看评论:如果用户可以拥有多个团队,您可能希望在用户和团队表之间建立一个表,其中UserId和TeamId为FK。这可能是您没有密钥的表,因为删除用户或团队应该通过该链接表级联(或错误)。

所以:

Player(PK)->(FK)PlayerStats
--if multiple users can have multiple teams
User(PK)->(FK)LinkTable(FK)<-Team
--if 1-1 user-team
User(PK)->(FK)Team
Team(PK)->Player(FK)