2012-11-29 39 views
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()才能获得我需要的所有信息。

所以我想一定有我的数据库设计中的一些严重缺陷。我想问一些如何让它变得更好/更容易的想法。

+0

如果可以显示设计的结构会更好,如果你还不太适应14连结和..你可以创建一个视图表,代码将简化一点 – jcho360

+0

通过迄今为止提供的设置,我没有看到你的想法存在明显的缺陷。看起来你似乎有很多不同的东西,而且他们之间有很多关系。然而,如果你希望能够提取大量有关某个特定地点的数据,这实际上意味着你希望在特定的地方获得文档。你看过[MongoDB](http://www.mongodb.org/)吗?它的设计从头开始以文件为中心进行存储。 – tmesser

+0

@YYY MongoDB看起来和我需要的完全一样,但现在已经太晚了(我正在开发的项目距离截止日期还不算太远)。但是,谢谢你的想法。 看起来现在我会坚持我的14个连接。 – Alexander

回答

0

数据库标准化的目的主要是避免在某种程度上是多余的,易受数据异常存储数据。

这有时会导致复杂的查询检索所有数据,但那是因为你正在制作信息的性质是复杂的。尽管如此,规范化的设计对于避免数据变得混乱的目的来说更好。

我建议,如果你有有很多的DISTINCT和GROUP_CONCAT这样复杂的查询,你可能试图获取在单个查询太多的信息。使用两个或三个查询并不一定是有害的,并且通过让代码更易于读取,维护和调试,您可能会受益匪浅。

我写了一篇关于这个问题在我的书题为“意大利面条查询”一章中,SQL Antipatterns: Avoiding the Pitfalls of Database Programming