首页 > 解决方案 > MYSQL 一个表里面有几千个表。是否可行且有效?

问题描述

我正在抓取 ufc 数据。数据分为三层。

  1. 由具有特定日期的事件列表组成的事件数据。例子
  2. 匹配特定日期的列表数据。例如,某个日期有 10 个匹配项。例子
  3. 每轮比赛结果统计。例子 在此处输入图像描述 在此处输入图像描述

我使用外键完成了 1 和 2 的数据库制作。

我的 1 表如下所示

Index | event             | date       |
0     | UFC 2: No Way Out | 1994-03-11 |

我的 2 表如下所示

| index | event_index |
|     0 |           0 |

问题是我不知道 3 与 2 有什么关系。从链接中可以看出,3 的统计信息太多。我想做一个由表组成的表,每个表都是3。但是MYSQL似乎没有“表内表”的特性。我怎么能组织这个?提前致谢。

当然,我应该稍后在引用 3 作为外键时由单个战斗机创建一个新的数据表。

标签: mysqldatabaseschema

解决方案


如果您以清晰、一致的语言陈述业务领域,将会有所帮助。

  • 系统有很多事件。
  • 事件具有日期、开始时间、位置和名称等属性。
  • 一个事件有 1 个或多个匹配项。
  • 每场比赛只有 2 名参与者。
  • 比赛的属性包括重量等级、获胜者、持续时间、获胜方式。参与者有属性(不明白KD STR TD SUB是什么意思)。
  • 对于每场比赛,每个参与者都有统计数据。这些分为两种类型:
    • 总计(具有属性 KD SIG. STR. SIG. STR. % TOTAL STR. TD TD % SUB. ATT REV. CTRL)和
    • 带有属性的重大打击(SIG. STR SIG. STR. % HEAD BODY LEG DISTANCE CLINCH GROUND)。
    • 一场比赛有3到5轮。每一轮都有统计数据。这些分为两种类型:
    • 总计(具有属性 KD SIG. STR. SIG. STR. % TOTAL STR. TD TD % SUB. ATT REV. CTRL)和
    • 带有属性的重大打击(SIG. STR SIG. STR. % HEAD BODY LEG DISTANCE CLINCH GROUND)。

然后在表格中建模:

Events
-------
Event_id (PK)
Location (FK?)
date
start_time
....

Match
-----
Match_id (PK)
Event_id (FK)
Contestant_one_id (FK)
Contestant_two_id (FK)
weight_class (FK?)
winner
duration
method_of_win

Participants
--------------
participant_id (PK)
name
nick_name

match_stat_total
---------------
match_id (FK)
participant_id (FK)
 KD
SIG
STR
...

match_stat_significant_strikes
-----------------
match_id (FK)
participant_id (FK)
SIG, 
STR, 
%HEAD
....

round
------
match_id (pk)(fk)
match_number(pk)

match_round_total
---------------
match_id (FK)
match_number (FK)
participant_id (FK)
 KD
SIG
STR
...

match_round_significant_strikes
-----------------
match_id (FK)
match_number (FK)
participant_id (FK)
SIG, 
STR, 
%HEAD
....

您可以在单个表中建模统计数据,使用组合外键 match_id、participant_id 链接到比赛和参与者,并将所有统计数据包含在一个表中;这是一个品味问题。

我包含了一个名为的表,round因为它允许您保护统计表中的引用完整性 - 应用程序不可能在这些表中存储无效轮次,因为您需要将这些与“轮”表中的条目相匹配。这是一个品味问题。


推荐阅读