【问题标题】:Multiple table database design多表数据库设计
【发布时间】:2013-01-08 04:53:49
【问题描述】:

我有一个网站,其中显示了运动员名单及其统计数据。用户可以注册并创建一个由这些球员组成的球队,我可以在其中汇总和分析球队统计数据。我想让每个用户都能够从列表中“划掉”一名球员(但不将他们从数据库中删除),并在需要时将已划掉的球员恢复到名单中。被划掉或未被划掉的球员需要保存在数据库中,这样当用户返回网站时,他们的名单就会被保存。

这些是我目前拥有的表格:

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.)

我很确定有更好的方法将信息存储在 Teams 表中,其中我有一个用户 ID 列,然后是 30 个列(编号 1-30),我存储球员姓名和他所在的位置在单元格中选择(以这种格式播放器名称/位置)。一个团队最多可以包含 30 名玩家。

我想我需要一个“可用表”来存储哪些玩家被哪些用户划掉了。考虑到用户可以从列表中删除多达 600 名玩家,我不确定解决此问题的最佳方法是什么。

任何建议都将不胜感激,我对处理数据库完全陌生,我似乎碰壁了。

谢谢!

【问题讨论】:

标签: mysql database database-design database-normalization


【解决方案1】:

您可能应该从球队表中删除球员数据,并为球员和球队数据设置一个连接表。

所以你最终得到了

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 的连接是唯一的,可以用作此表的键。

【讨论】:

  • 这个 Team_Players 表是否会为每支球队和每个球员组合设置一行?这会导致大约 600 名玩家和许多用户出现问题吗?
  • @user1956847 它不会在功能方面造成任何问题,但通常 any 查询的性能会随着要查询的记录数的增加而降低。您还应该为Team_IDPlayer_ID 列设置索引,以便数据库对Team_Players 表上的查询进行一些查找优化。
  • 根据您的规范,每个团队/用户组合只有 30 条记录。
【解决方案2】:

阅读本教程。很有帮助:

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

数据库的设计取决于给定球员是否可以属于数据库中的多个球队。如果可以,那就是has and belongs to many 关系,您需要一个链接表,可能称为Players_Teams(始终按字母顺序列出表)。此表还可以包含您所说的 crossedOff 列。

使用像 ActiveRecord 或 Doctrine 这样的 ORM(对象关系映射器)可以大大减少您需要编写的代码量,从而在代码中使这些关系的管理在某种程度上“自动化”。

【讨论】:

  • 感谢您的帮助,该教程真的很有帮助。我想我理解它,但我担心 Players_Team 表中的大量潜在记录。使用 crossedOff 属性,每个用户可能有 600 条记录。随着用户数量的增加,这会产生问题吗?
  • 您可以考虑将非规范化作为替代方案(例如,将相关记录存储为 json),但这会使统计数据变得更加困难。只要您在代码中通过主键查询,数据就会随着您的扩展而轻松分片。 MySQL 也有能力处理具有正确索引和缓存的大型表。
猜你喜欢
  • 2016-01-20
  • 2012-02-19
  • 2013-12-28
  • 2011-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多