【问题标题】:MySQL - Organizing Database Content (Sports League)MySQL - 组织数据库内容(体育联盟)
【发布时间】:2013-08-24 22:52:16
【问题描述】:

我正在为我的青年体育组织设计一个 PHP/MySQL 解决方案,该解决方案将显示参加任何特定赛季的球队的赛程表和排名。不幸的是,当涉及到数据库设计时,我只是在学习绳索,并且在思考应该是一个相对简单的概念时遇到了一些挑战。也许有人可以介入并澄清几点?

我不清楚的是如何准确地构建数据库和表以正确启动。这是我最终需要设置的:

  1. 我们有大约 50 所成员学校。每个人都需要自己的登录 ID 和密码。我正在考虑将这些数据存储在他们自己的单独数据库中,因为这些帐户将在每个赛季再次重复用于代表球队,并允许教练登录并更新他们的比赛结果。

  2. 每个赛季都有两种不同的运动。例如,即将到来的秋季有一个女子排球联赛和一个男子足球联赛。然后,每个联赛都有多个分区(按地理区域划分),学校在这些分区中进行常规赛。我不确定每个赛季是否需要自己单独的数据库、每个联赛等。

  3. 每个赛区的常规赛将从日程安排程序(通过 Excel 电子表格)导入并显示在其自己的网页上,学校可以在其中查看即将举行的比赛并登录以更新结果。

  4. 随着比赛结果的更新,我需要找到一种方法将这些结果反映在显示该分区联赛排名的单独网页上。

为了更清楚地展示我想要做什么,请查看我为赛程表和排名数据分别创建的这两个模拟页面:

http://www.712jefferson.org/pal/schedules.html

http://www.712jefferson.org/pal/standings.html

我正在这里寻求您的指导。我应该如何为所有这些数据构建 MySQL 框架?

我正在考虑为学校登录 ID 建立一个单独的数据库,然后为每个季节性运动(例如 2013 年男子排球)建立一个单独的数据库,其中每个部门都有单独的表格和 x 列来表示时间表和排名其中。

这听起来对吗?我想这一切都错了吗?非常感谢任何有助于充实这一思维过程的帮助或指导!

非常感谢!

【问题讨论】:

  • 现在快速说明 - 几乎没有充分的理由为每个用户/学校/任何东西拥有一个单独的数据库。一个数据库处理一切。有一个用户表和一个学校表,其中包含属于学校的用户。
  • 优秀。感谢您的反馈!将用户与其他所有内容分组在一起时,我担心的是我会想一次又一次地使用他们的帐户(年复一年),而季节会定期变化。我不确定每个季节是否会包含如此多的数据以需要自己的数据库,因此必须使用每个新数据库重复用户。但是,如果这不是问题,那就完美了!
  • 我还应该说,虽然这是一个有趣的问题,但它不适合在这里 - 主题问题的指导方针表明话语性帖子或仅感兴趣的项目对一位读者来说,往往会气馁。所以,如果这结束了,请不要担心 - 无论如何,你已经在下面得到了很多想法。

标签: php mysql database-design mysqli


【解决方案1】:

哎哟。你承担了一项重大工作。您是否绝对确定您将要做的任何事情都不能通过已经可用的东西来完成?好吧,如果您确定,请继续阅读。

首先,您要做的最困难的部分是管理您的用户访问权限。我建议您先编写用户管理模块,然后再继续。

对于您想要的,Drupal 或其他高级 CMS 系统似乎是引导系统的好方法。 Drupal 将立即处理您的用户管理(或问题最少),您可以将其余代码编写为静态节点。这也使得添加博客、论坛、新闻和管理邮件列表等变得容易。

如上述 cmets 所述,您确实需要将数据保存在一起。最好保留数据以进行历史比较。

如果不扩展 CMS,在您从精神科医生那里回来后,您将需要以下内容:

  1. 用于访问数据库并检查用户身份验证的头文件。

  2. 用于显示数据的页脚文件

  3. 用于展示或获取您的数据的单独页面文件。

处理用户的数据库结构(至少)应该是 IRO:

Person - details of individual users
username - link person to a username
email - email addresses
club - sports club details
password - passwords
logon - record of logon attempts
role - record of role of individuals in your site
permissions - list of required permissions to access areas of the site
role_permissions - default permissions for each role
person_role - link person to role
person_permissions - link person to permissions (only needed if some individuals need extra permissions not given routinely by their role)
club_person; person_email; - link people to clubs and to their email addresses.

要处理您需要的匹配项:

team - team name, group and club reference
grouping - list of groups eg by age.  
divisions. - list of divisions
venue - list of venues.  Include GPS!!!
match - division, grouping, team1, team2, venue, date, time
result - team1 reported result, team 2 reported result, approved result (you may need to intervene!) match.

如您所见,您需要几张桌子,但在您的用户访问权限正常工作之前,您不得尝试与实际团队一起做有趣的事情。

我为您绘制的是一个正常形式的数据库。没有文本数据重复,数据易于检索、索引和显示。我确实觉得这个问题对于 SO 来说太宽泛了,因为为您设计数据库有点超出范围,但我确实认为一般格式很有用。

每个表应该只包含唯一的必要数据,例如:

Person:  personid int, surname, forename, style, whenadded, whoadded, inuse
email:   emailid, email, whenadded, whoadded, inuse
email_person:  emailpersonid,emailid,personid, whenadded,whoadded,inuse

这允许多人共享一封电子邮件,并将多封电子邮件应用于一个人,而不会重复文本。 ID 应该是 INT AUTO_INCREMENT PRIMARY KEY 而不是 SERIAL 类型,因为这样可以节省大量存储空间,而且您永远不会在此应用程序中填写 INT。

其他表应以相同方式创建。 whoadd 和 when added 列是可选的,非常需要存储空间,但非常有用。 inuse 是必不可少的,将其设置为 BOOL,您可以在不删除团队的情况下删除团队 - 数据不会丢失。 whenremoved 和 whoremoved 对于审计也很有用。

关于密码的一句话 - 请确保将这些密码存储为 SALTED HASH。如果你这样做,当你的网站被黑客入侵时,没有人会暴露他们也用于网上银行的密码。人们往往是白痴。你必须照顾他们。

正如我所说,有点超出范围,所以我将在此结束答案 - 它根据要求为您提供了第四范式 Db 的基本轮廓,它将是健壮且可扩展的,但让您完成工作。如果问题太难了,为什么不问更多问题。

祝你好运。

添加:

DIY 框架:

如果您不想学习使用现有框架或 CMS 之一,则需要自己编写。奇怪的是,这实际上非常简单。

header.php:

<?PHP
$mysqli=new mysqli(credentials....)//connect to database and present a mysqli or pdo object.
session_start(); //open a session
//you will need to authenticate your session here - see below
?>

页脚.php:

<HTML>
<HEAD>
<TITLE>
<?PHP echo $pagetitle;?>
</TITLE>
</HEAD>
<BODY>
<?PHP echo $content;?>
</BODY>
</HTML>

这些被 mypage.php 使用:

<?PHP
require("header.php");
//do some stuff that generates $content
$pagetitle="mypage.php";
require("footer.php:);
?>

应该强调的是,这是您需要的最低限度,而且确实很糟糕 - 它只是为了说明应该如何开始,而不是理想代码的示例。但它会起作用。

关键是创建一个显示您需要的变量的标题,例如数据库连接、用户名、用户登录状态等,以及一个您可以输入详细信息以显示数据的页脚。页脚是唯一结合 HTML 和 PHP 的地方。

使用您的 $_SESSION 来存储需要在页面之间保留的信息。

这些文件可以简单也可以复杂,我在很久以前就创建了自己的文件,它对用户和会话进行了多次检查,并且可以在页脚中显示脚本、自定义 CSS 文件等。如果您从简单开始并根据需要进行构建,这并不难。 SO将在这里为您提供帮助。

提醒一句:虽然你可以从很简单的开始,但你想做的事是有腿的,而且会失控。请在您的代码启动并运行后对其进行审核,以确保您没有无意中包含安全漏洞。当您进入项目并需要快速修复时,很容易将它们包含在内,除非您正在寻找它们,否则以后很难发现它们。

【讨论】:

  • 关于数据库规范化的好建议,不过(关于问题中可用的有限细节)我倾向于选择框架而不是 CMS。后者的内部结构通常有很多不足之处,因此我倾向于仅在基于故事的内容管理实际上是其职权范围的一部分时才使用它们。用户管理模块可用于相当多的框架,它们将所有的哈希/加盐作为标准。
  • 很棒的帖子!感谢您的所有反馈。有价值的,有价值的东西。关于用户角色:我试图让它尽可能简单地管理。每所学校都将被分配一个确切的用户 ID。使用该 ID 存储的唯一其他数据是密码。他们只有在点击其中一款游戏的得分报告图标时才能使用该 ID 和密码,然后会收到一个简单的弹出窗口,其中包含用于输入结果的字段。我需要编写一些基本代码来验证参与该特定游戏的两个团队中只有一个团队正在更新结果。
  • 鉴于用户角色有限,您还会推荐一个 CMS 模块来管理他们吗?另外,halfer,如果您有时间,能否请您详细说明一下您所说的框架是什么意思?
  • 不,我会编写自己的系统。你甚至不需要太多的框架。见编辑。
  • @712Jefferson - 框架是专门用于构建应用程序的库。 PHP Web 框架将有助于以模块化方式构建您的服务器端应用程序,并随着时间的推移使其更易于维护和扩展。 Zend 和 Symfony 是两个被认为设计良好的示例,还有一些更简单的系统,例如 CodeIgniter 和 CakePHP。如果您的项目至少是中等规模,它们会很棒,但是要克服最初的复杂性,因此从头开始尝试(正如 Robert 建议的那样)可能是值得的。
【解决方案2】:

我站在你的立场上,我发现的最佳解决方案是使用后端即服务 (Baas) 提供商,例如 Parse.com 或 Stackmob.com 或许多其他提供商。他们为您完成数据库托管以及您的用户管理(登录/注册/忘记密码等),因此您不必担心。您可以通过 REST API 访问它们,并且它们在 Github 上也有 PHP 库。

由于您不熟悉数据库管理,这是一项非常重要的任务,因此此解决方案可能会为您省去一些麻烦。

当然,您仍然需要决定如何组织表(或 Parse 中的“类”,Stackmob 中的“模式”等),但它们也提供了关系 API 的帮助。他们有一个预定义的用户表,专门用于存储用户。

当然,他们的 API 不如 SQL 灵活,但它也可以安全地防止 SQL 注入,这是这种灵活性的一个缺点。另一方面,他们还提供自定义代码来增强这种灵活性。

编辑。 忘了说,那些 BaaS 平台还允许将数组存储为数据库字段,这真的很方便。

【讨论】:

    【解决方案3】:

    这可能是一个很大的构建。您可能想尝试现有的联赛管理服务。外面有几个。我认识一些使用Teamopolis 的朋友,他们对这项服务非常满意,我认为它可以满足您的所有需求。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-07
      • 1970-01-01
      • 1970-01-01
      • 2011-09-02
      • 1970-01-01
      • 1970-01-01
      • 2014-04-05
      • 1970-01-01
      相关资源
      最近更新 更多