基于多个表/主要& amp;获得最有效的查询外键

时间:2011-01-12 19:05:12

标签: mysql sql coldfusion

我有一个网站,其中一些页面(我们称之为网关页面)基于组织中的某些部门。每个部门都有与之相关的课程。不幸的是,我的某些页面与特定部门没有关联,但是显示了部门中几个类的信息,所以我不能仅仅依靠部门来查询数据库。

在每个类中使用来自网关表的fk创建一个名为gateway_classes的表是否更聪明,或者形成一个查询,以某种方式使用在查询期间提取的类数组从我现有的表中精确地过滤掉我需要的内容?

这是我的表格: departments_classes | classes_vendors | departments | vendors | classes | products | gateway

非常感谢任何指导。

更多信息:大约有350个班级,18个部门和12个网关页面......

2 个答案:

答案 0 :(得分:1)

你的索引表的想法听起来好像工作得很好。唯一不足之处在于您必须单独维护它,并且您希望确保您在该表中保存的数据不会在任何现有表中重复。

如果您不想以与当前正在执行此操作不同的方式维护该数据,则可以使用CF的数组(或结构)来保存该相关数据(您必须在单独的数据库中提取该数据)查询)然后在构造拉取给定页面的类的查询时循环它。

无论哪种方式都可行,更重要的是你更喜欢这样做,以及你认为最容易构建,测试和维护的内容。

关于效率的一件事 - 确保您不仅通过外键(有助于维护数据完整性)链接您的表,而且还放入(非聚簇)索引,这有助于您的查询的连接和查找效率做。

我已经在我的查询中看到了戏剧性的速度提升(对MS SQL进行操作的CFQUERY),只需简单地放入索引。

在MS SQL中,您这样做:

CREATE NONCLUSTERED INDEX yourIndexName ON yourTableName(yourFieldName)

我希望这有帮助!

答案 1 :(得分:0)

您的问题听起来类似于确定用户权限的常见方案。用户可能属于某个具有与之关联的权限的组,或者可以单独为用户分配权限。在您的情况下,用户是网关,组是部门,权利是类。然后,网关可以链接到任意数量的部门和/或类。

使用此模型,您只需要在描述时添加gateway_classes表以及gateway_departments表。

然后你可以使用UNION将“网关类”查询与“网关部门”查询(或者更优雅的东西)合并,但我认为这种模式确实需要你而不需要引入任何冗余信息。

相关问题