在我的数据库中,我有不同的实体,例如todos
,events
,discussions
等。
每个实体都可以有tags
,{{1} },comments
和其他相关项目。
现在我必须设计这些表之间的关系,我想我必须从以下两种可能的解决方案中进行选择:
1。分离的关系表
因此,我将创建files
,todos_tags
,events_tags
,discussions_tags
,todos_comments
,events_comments
等表格。
2。常见关系表
我只会创建这些表:discussions_comments
,related_tags
,related_comments
等,其结构如下:
related_tags
related_files
(event | discussion | todo | etc。 - enum或tinyint(1 | 2 | 3 | etc。))entity
entity_id
我应该使用哪种设计?
可能你会说:这取决于具体情况,我认为这是正确的。
我的大部分时间(可能是70%以上)我只需查询其中一个实体(事件,讨论或待办事项),但在某些情况下我需要在同一个查询中使用它们(两个事件,讨论,例如,具有指定标签的待办事项。在这种情况下,如果我使用分隔关系表,我将不得不在3+表上进行联合(在我的情况下,它可以是5+表)。
每张表中的行数不会超过1000-2000(事件,讨论,待办事项);
什么是正确的方法?有什么个人经历?
答案 0 :(得分:2)
第二个架构更具可扩展性。这样,您就可以扩展应用程序以构建涉及多种类型的查询。此外,甚至可以动态地为未来轻松添加新类型。此外,它允许更大的聚合自由度,例如,允许您计算每种类型中存在多少行,或者在特定时间范围内创建的行数。
另一方面,第一种设计除了速度之外并没有其他许多优点:但MySQL已经擅长以足够快的速度处理这些类型的查询。您可以创建索引“实体”以使其顺利运行。如果将来需要对表进行分区以提高速度,可以在以后阶段进行。
答案 1 :(得分:2)
设置单个公共关系表(例如related_tags)是一种更简单的设计,您可以在列中指定实体类型而不是具有多个表。只需确保将实体和tag_id字段正确编入索引以获得最佳性能。