mysql - 相关组/列表的数据库设计

标签 mysql database database-design

我正在创建搏击运动统计网站。我在设计将保存特定回合统计数据的数据库时遇到了麻烦,例如战斗结束的方式。

它可以非常简单:

-> Decision  

要么
-> Decision -> Unanimous  

要么
-> Decision -> Unanimous -> 30-27, 29-28, 29-28   

要么
-> Submission -> Armbar

在这种情况下,我们有一个简单的树(每个项目可以有一个或多个 child ),它可以通过简单的 (id, "Name", parent_id) 来实现。组织。在其中,对于每场战斗,我都会分配一些唯一的 bout-finish-id 并上树以与 parent 、链接和所有东西建立一个适当的链。

不幸的是,有些项目有多个父项,情况也可能更复杂一些:
-> Submission -> Armbar -> Armbar triangle  
-> Submission -> Triangle -> Armbar triangle

这应该很容易,因为“Armbar triangle”显然是“Armbar”和“Triangle”的子代。但是此时我已经迷路了,不太了解如何正确设计这个多父列表。

但还有更多。

还有大量其他统计数据。例如,所述完成的所有其他细节。在 KO/TKO 胜利的情况下,这可能是有关每个战士姿态(左、右、中立)、特定打击、有关移动的信息、命中区域等的一些信息。类似于“TKO。从右肘向上移动右肘-位置在左手对手下巴的左侧。”。

如果我们谈论提交,我们来谈谈位置的简单例子。
-> Submission -> Triangle -> Armbar triangle -> Guard position  

要么
-> Submission -> Triangle -> Armbar triangle -> Mount position

但这里的问题是 Guard 或 Mount 可以在这条链的任何点。以下所有内容都是正确的:
-> Submission -> Triangle -> Guard position -> Armbar triangle  
-> Submission -> Guard position -> Triangle -> Armbar triangle  
-> Guard position -> Submission -> Triangle -> Armbar triangle 

在这里,我们遇到了一些相互关联的项目的问题,这基本上意味着一个人可以在一个无限循环中继续下去。这显然是数据库设计和渲染中的一个巨大问题。

我无法按特定顺序放置信息(例如,始终将位置放在末尾),因为我希望能够单击每个条目并能够查看与该条目相关的所有 parent / child 。

我唯一能想到的就是完全分离不同的信息(提交、打击、决定、立场、位置、命中目标等的不同列表)。然后我创建一个类似标签的列表,我可以在其中放置尽可能多的“战斗结束标签”。这是实现我想要的唯一正确方法吗?

但这意味着我不能轻易检查例如所有“来自Guard的三角形”,或者我需要制作一个精心设计的标签组合系统......

但这还不是全部。

我还希望能够保存导致完成的事件链。
-> Loser's (righty) left hook to winner (lefty)'s right jaw -> Loser's Ground and Pound from Guard -> Winner's Armbar triangle from Mount

这是描述的示例,它只能包含先前定义的“正确饰面”。

现在我们已经完成了,我有机会讲述我的梦想系统(无论它是否可以实现),如果能够包含所有不在“官方整理”中的细节,那就太好了列表”,例如“向右滑”、“双腿倒地”、“Hipbump 扫/反转”等等。

信不信由你,但还有更多……即使我们忘记了最后的愿望(关于滑倒和删除),我真的很希望能够根据级别对事件链中的项目进行评分他们影响了结果。例如从 1 到 3。类似:
-> Loser's (righty) left hook to winner (lefty)'s right jaw (3) -> Loser's Ground and Pound from Guard (1) -> Winner's Armbar triangle from Guard (3)

我想正确地制作这个功能,我想从一开始就正确地实现它。但我觉得我把这个问题复杂化了。我觉得我的幻想太过分了,但似乎无法停止。有没有办法根据我的所有意愿创建正确的数据库结构?我应该选择什么样的表/行结构?还是我应该简单地忘记这种疯狂并将其缩小到合理的(无论这意味着什么)设置?那么我的问题的合理解决方案是什么?

最佳答案

我不太了解您的主题领域,但阅读您的问题提出了一些想法。

首先,如果您想查找特定事件,请不要实现“精心设计的标签组合系统”。就数据库结构而言,这通常意味着逗号分隔的列表,这在 SQL 中是非常禁忌的。

更好的是,您应该有一个回合表和第二个与回合相关的事件表。您需要定义第三个表格,其中包含所有可能的事件(左钩到右下巴,右钩到左下巴)以及相关的 id 编号,以及第四个带有 id 的参赛者表格。然后,您的比赛表将包含有关比赛本身的信息(地点、日期等)以及竞争对手的 ID。事件/回合表将包含回合的 ID、回合内事件的时间、执行该 Action 的参赛者的 ID 以及事件本身的 ID。

关于mysql - 相关组/列表的数据库设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18345989/

相关文章:

php - 如何在 PDO 中打印 while() 循环

php - 如何开始使用 PHP 和 MySQL 中的 session ID?

匹配所有标签的多个 "tags"(多对多关系)的Mysql连接查询?

sql - 具有可变属性的项目的数据库设计?

mysql - 将三个电话号码之一存储为数据库中的主号码

mysql - 如何添加一个N :M relationship to my MySQL symptoms and diseases database?

MySQL 错误 : Cannot add foreign key constraint?

mysql - LEFT JOIN 优化

mysql - 插入数据库未知错误

database-design - 数据库架构问题