多表数据库设计

问题描述:

我有一个网站,显示运动员列表和他们的统计数据。用户可以注册并创建一个这些球员的队伍,我可以总结和分析球队的统计数据。我希望每个用户都能够从列表中“跳出”一名玩家(但不能将其从数据库中移除),并且如果需要的话,恢复已被划掉的玩家。被划掉或未划掉的玩家需要保存在数据库中,因此当用户返回到站点时,他们的列表被保存。多表数据库设计

这些是我目前拥有的表:

Players Table (COLS: Name, Team, Position, Stats, etc.) 
Users Table (COLS: User ID, Name, Email, etc.) 
Teams Table (COlS: User ID, 1, 2, 3, etc.) 

我敢肯定有一个更好的方式来存储在团队表信息,我有用户ID一列,然后30列(编号1-30),我存储他在单元格中选择的玩家名称和位置(以这种格式的玩家姓名/位置)。一个团队可以组成30人。

我想我需要一个“可用表”来存储哪些玩家被哪些用户划掉了。我不确定考虑到用户可以从列表中挑选600名玩家,最好的方式是什么。

任何建议将不胜感激,我完全不熟悉处理数据库,我似乎打了一堵墙。

谢谢!

+1

http://*.com/questions/14207821/how-to-structure-large-mysql-database –

您应该从团队表中删除玩家数据,并为玩家和团队数据设置连接表。

所以你最终

Teams Table (Cols: ID, User ID, Team Name) 
Team_Players Table (Cols: Team_ID, Player_ID, Position, Active) 

那么你可以得到哪些球员是哪支球队通过运行Team_Players查询和检查,如果他们是活跃与否。

我没有添加ID字段,因为Team_ID和Player_ID的连接将是唯一的,并且可以用作此表的键。

+0

这个Team_Players表可能会为每个球队和每个球员的组合排?这会对约600名玩家和许多用户造成问题吗? – rodzilla

+0

@ user1956847它不会在功能方面造成任何问题,但通常_any_查询的性能会随着要查询的记录数量的增加而下降。您还应该为“Team_ID”和“Player_ID”列设置索引,以便DB在“Team_Players”表上为您的查询进行一些查找优化。 –

+0

根据您的规格,每个团队/用户组合只有30条记录。 –

阅读本教程。这是非常有帮助的:

http://www.tomjewett.com/dbdesign/dbdesign.php?page=association.php

数据库的设计依赖于一个给定的玩家是否可以属于多个团队在数据库中。如果可以的话,这是一个has and belongs to many关系,你需要一个链接表,或许叫做Players_Teams(总是以alpha顺序列出表)。此表格还可能包含您正在讨论的crossedOff列。

使用像ActiveRecord或Doctrine这样的ORM(对象关系映射器)可以大大减少需要编写的代码量,以便在代码中对这些关系进行有些“自动”的管理。

+0

感谢您的帮助,该教程真的帮助。我想我明白了,但我担心Players_Team表中潜在的大量记录。通过交叉偏移属性,每个用户可能会有600条记录。随着用户数量的增加,这会造成问题吗? – rodzilla

+0

您可以考虑使用非规范化作为替代(例如,将关联记录存储为json),但它会使统计更难。只要您通过代码中的主键查询,数据在您缩放时就会很容易碎片化。另外MySQL有足够的能力处理大型表格,并提供正确的索引和缓存。 – jchook