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

时间:2012-10-16 08:36:53

标签: mysql database database-design

在我的数据库中,我有不同的实体,例如todoseventsdiscussions等。
每个实体都可以有tags,{{1} },comments和其他相关项目。

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

1。分离的关系表

因此,我将创建filestodos_tagsevents_tagsdiscussions_tagstodos_commentsevents_comments等表格。

2。常见关系表

我只会创建这些表:discussions_commentsrelated_tagsrelated_comments等,其结构如下:

related_tags

  • related_files(event | discussion | todo | etc。 - enum或tinyint(1 | 2 | 3 | etc。))
  • entity
  • entity_id

我应该使用哪种设计?

可能你会说:这取决于具体情况,我认为这是正确的。

我的大部分时间(可能是70%以上)我只需查询其中一个实体(事件,讨论或待办事项),但在某些情况下我需要在同一个查询中使用它们(两个事件,讨论,例如,具有指定标签的待办事项。在这种情况下,如果我使用分隔关系表,我将不得不在3+表上进行联合(在我的情况下,它可以是5+表)。

每张表中的行数不会超过1000-2000(事件,讨论,待办事项);

什么是正确的方法?有什么个人经历?

2 个答案:

答案 0 :(得分:2)

第二个架构更具可扩展性。这样,您就可以扩展应用程序以构建涉及多种类型的查询。此外,甚至可以动态地为未来轻松添加新类型。此外,它允许更大的聚合自由度,例如,允许您计算每种类型中存在多少行,或者在特定时间范围内创建的行数。

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

答案 1 :(得分:2)

设置单个公共关系表(例如related_tags)是一种更简单的设计,您可以在列中指定实体类型而不是具有多个表。只需确保将实体和tag_id字段正确编入索引以获得最佳性能。