锦标赛管理软件的数据库设计

时间:2012-06-26 06:24:11

标签: mysql sql database database-design

我目前正在使用php,javascript和MySQL设计一个Web应用程序。我正在考虑数据库的两个选项。

拥有所有锦标赛的主表,其中存储了基本信息以及锦标赛ID。然后我会创建分区,括号,匹配等表,并在每个表名后附加锦标赛ID。然后在访问该锦标赛时,我会做一些类似“SELECT * FROM BRACKETS_ [在这里插入锦标赛]”的内容。

我的另一个选择是只使用通用括号,分区,匹配等表格,每个记录通过相应列中的外键链接到相应的锦标赛(或与括号,括号到分区等匹配) 。

我对第一种方法的关注是,它对我来说有点过于繁琐,似乎数据库可能会很快变得混乱。我对第二种方法的关注是表现。希望这个项目有一个全国性的,如果不是国际性的,我关注的是单个表中的这么多记录,并且有很多人可能会同时点击它,这可能会导致问题。

在数据库管理方面,我不是一个完整的新手;然而,这是我完全独自完成的第一个,所以任何和所有的帮助都表示赞赏。谢谢!

4 个答案:

答案 0 :(得分:3)

不要为每个锦标赛创建表格。表是实体的类型,而不是实体的实例。如果你混淆这些概念,可维护性和可扩展性将是可怕的。你甚至自己这样说:

  

这个计划有望在全国范围内具有国家影响力,而且我关注的是一张桌子上有如此多的记录,并且有很多人可能会在同一时间点击它,这可能会导致问题。

如果您需要为每条记录创建一个完整的表格,您将如何扩展到该级别?

关于第二种方法的表现,您为何担心?您是否有特定的指标来支持这些问题?关系数据库往往非常善于查询关系数据。因此,请保持数据关系。不要试图发挥创意,破坏您正在使用的数据库技术的设计。

您已命名几种类型的实体:

  • 支架
  • 匹配
  • 竞争

这些对我来说就像桌子。根据您查询数据的方式管理索引(也就是说,不要过度索引,或者使用插入/更新/删除来为它付费)。适当地规范化数据,在审计和报告更普遍的地方进行去标准化等。如果您担心性能,请密切关注访问数据的方式的查询执行路径。轻微的调整可以产生很大的不同。

不要过早优化。它增加了复杂性而没有任何实际原因。

答案 1 :(得分:2)

首先,找到您需要存储的实体;锦标赛,赛事,团队,竞争对手,奖品等等。每个实体都可能是表格。

标准做法是为每个人设置一个主键。有时会有唯一标识行的列(或列组),因此您可以将其用作主键。但是,通常最好只有一个名为ID的列或类似数字类型的列。 RDBMS为这些列创建和使用索引会更快更容易。

将数据存储在它所属的位置:我希望在events表中看到事件的日期和时间,而不是在prizes表中。

另一个关键点是符合First normal form,因为这确保了数据的原子性。这很重要,因为它可以在以后为您节省很多麻烦。通过正确执行此操作,您还将拥有正确数量的表。

最后但并非最不重要:将相关索引添加到查询中最常出现的列。这对性能有很大帮助。不要担心有太多行的表,RDBMS-es现在处理具有数亿行的表,它们的设计能够有效地完成。

答案 2 :(得分:1)

每当项目的新实例出现时创建新表的想法都非常糟糕,抱歉。

一个(肯定不完整)列表,说明为什么这是一个坏主意:

  • 无论何时创建新分区或其他内容,您的代码都需要自动添加表格。这绝对是一种不好的做法,应该限于非常小众的情况 - 你肯定不是。
  • 如果您决定稍后添加或修改表格结构(例如添加新字段),则必须将其添加到数百个表中,这将非常麻烦,容易出错且需要大量维护头痛
  • 构建RDBMS是为了按行进行扩展,而不是表和关联(索引,触发器,约束)元素 - 因此您正在反对您的工具,而不是使用它。
  • 这一个应该是真正的CLINCHER - 您打算如何处理诸如“列出星期日播放的所有比赛”或“找到Frank Perry活跃的最近三个括号”之类的请求?

你说:

在数据库管理方面,我不是一个完整的新手;然而,这是我完全独自完成的第一个......

你还能记得每当需要新的一套时克隆表的另一个项目吗?如果是,您是否注意到该方法存在一些问题?如果没有,您是否认为这正是DBA因任何原因从未做过的事情?

答案 3 :(得分:1)

除了损害代码的质量和可维护性之外(正如其他人所指出的那样),你是否真的获得了任何性能也是值得怀疑的。

执行时......

SELECT * FROM BRACKETS_XXX

... DBMS需要找到名称与“BRACKETS_XXX”匹配的表,并且搜索是在DBMS'es数据字典中完成的,DBMS'es数据字典本身就是一堆表。因此,您将使用数据字典表中的搜索替换表中的搜索。你以任何一种方式支付搜索价格。

(字典表可能是也可能不是“真实”表,并且可能有也可能没有与真实表类似的性能特征,但我敢打赌,这些性能特征不一定比“普通”表更好。 行数。此外,数据字典的性能不太可能记录在案,您真的不应该依赖未记录的功能。)

此外,DBMS突然需要prepare更多的SQL语句(因为它们现在是不同的语句,指的是单独的表),这会对性能产生额外的压力。