Mysql:不同实体的单独或通用关系表

Mysql:不同实体的单独或通用关系表,mysql,database,database-design,Mysql,Database,Database Design,在我的数据库中,我有不同的实体,如TODO,事件,讨论,等等。每个实体都可以有标记,注释,文件,以及其他相关项目 现在我必须设计这些表之间的关系,我认为我必须从以下两种可能的解决方案中进行选择: 1。分开的关系表 因此,我将创建todos\u标签,events\u标签,discussions\u标签,todos\u评论,events\u评论,等等表格 2。常用关系表 我将只创建以下表:相关的\u标记,相关的\u注释,相关的\u文件,等等。其结构如下: 相关标签 实体(事件|讨论|待办事项|等-

在我的数据库中,我有不同的实体,如
TODO
事件
讨论
,等等。
每个实体都可以有
标记
注释
文件
,以及其他相关项目

现在我必须设计这些表之间的关系,我认为我必须从以下两种可能的解决方案中进行选择:

1。分开的关系表

因此,我将创建
todos\u标签
events\u标签
discussions\u标签
todos\u评论
events\u评论
,等等表格

2。常用关系表

我将只创建以下表:
相关的\u标记
相关的\u注释
相关的\u文件
,等等。其结构如下:

相关标签

  • 实体
    (事件|讨论|待办事项|等-如枚举或tinyint(1 | 2 | 3 |等)
  • 实体id
  • tag\u id
我应该使用哪种设计

也许你会说:这取决于形势,我认为这是正确的

大多数情况下(可能70%+)我只需要查询其中一个实体(事件、讨论或TODO),但在某些情况下,我需要在同一个查询中查询所有实体(例如,两个事件、讨论、TODO都有指定的标记)。在这种情况下,如果使用分离的关系表,我必须在3+个表(在我的情况下可以是5+个表)上执行union

每个表中的行数不超过1000-2000行(事件、讨论、待办事项)


正确的方法是什么?这方面有哪些个人经验?

第二种模式更具可扩展性。通过这种方式,您将能够扩展应用程序以构造涉及多种类型的查询。此外,即使是动态地,也可以轻松地向未来添加新类型。此外,它允许更大的聚合自由度,例如,允许您计算每种类型中存在多少行,或者在特定时间段内创建了多少行


另一方面,第一种设计除了速度之外并没有其他优势:但MySQL已经能够以足够快的速度处理这些类型的查询。您可以创建一个索引“实体”,以使其顺利工作。如果将来需要对表进行分区以提高速度,您可以在以后的阶段进行分区。

一个简单得多的设计是使用一个公共关系表,例如在列中指定实体类型的相关_标记,而不是使用多个表。只需确保将实体和标记id字段正确地索引在一起,以获得最佳性能