存储场所属性的DB结构

btqmn9zl  于 2022-10-22  发布在  Mysql
关注(0)|答案(1)|浏览(96)

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

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

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

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个Join和7个GROUP_CONCAT()。
所以我认为我的数据库设计一定有一些严重的缺陷。我想问一下如何让它变得更好/更容易。

lsmepo6l

lsmepo6l1#

数据库规范化的目标主要是避免以冗余和易受数据异常影响的方式存储数据。
它有时会导致检索所有数据的复杂查询,但这是因为您正在建模的信息的性质是复杂的。然而,规范化的设计对于避免您的数据变得一团糟是更好的。
我建议,如果您有这样复杂的查询,其中包含大量DISTINCT和GROUP_CONCAT,那么您可能会试图在单个查询中获取太多信息。使用两个或三个查询并不一定有害,通过使代码更易于阅读、维护和调试,您可能会受益匪浅。
我在我的书SQL Antipatterns Volume 1: Avoiding the Pitfalls of Database Programming中题为“意大利面条查询”的一章中提到了这个问题

相关问题