2

我必须存储有关学校和大学的数据(还计划了更多实体,例如语言课程)。

我必须存储的数据列表:

  • 可用的学习计划
  • 住宿选择
  • 特殊饮食的可用性
  • 等等

所以我为学校和大学创建了表格:

Place (place_id, name, city_id ... )
School (place_id (FK), school_type ...)
University (place_id (FK), ... )

和选项表:

Accomodation (accomodation_id, name, description ...)
Activity (activity_id, name, category ...)
...

而且因为它总是有可能不止一个选项,所以我将它们与这样的表格绑定在一起:

Accomodation_to_place (place_id, accomodation_id)
...

但我发现很难更新甚至从整个事情中获取数据。我必须进行 14 次联接和 7 次 GROUP_CONCAT() 才能获得我需要的所有信息。

所以我认为我的数据库设计中一定有一些严重的缺陷。我想询问任何如何使它更好/更容易的想法。

4

1 回答 1

0

数据库规范化的目标主要是避免以冗余且易受数据异常影响的方式存储数据。

它有时会导致检索所有数据的复杂查询,但这是因为您正在建模的信息的性质很复杂。然而,为了避免您的数据变得一团糟,规范化设计更好。

我建议,如果您有如此复杂的查询,其中包含大量 DISTINCT 和 GROUP_CONCAT,您可能会尝试在单个查询中获取太多信息。使用两个或三个查询不一定有害,通过使代码更易于阅读、维护和调试,您可能会受益很多。

我在我的书《 SQL 反模式:避免数据库编程的陷阱》中标题为“意大利面条查询”的一章中写到了这个问题

于 2012-11-29T19:27:46.620 回答