入门基于多个表/主及外键
我有哪里一些页面(我们称之为网关页)一个网站的最有效的查询是在某些部门在组织松散的基础。每个部门都有与之相关的课程。不幸的是,我的一些页面没有与特定部门相关联,但显示的信息来自部门的几个类,因此我不能仅仅在部门中严格查询数据库。入门基于多个表/主及外键
从每个类中的网关表创建一个名为gateway_classes的表与一个fk的表,或者形成一个查询以某种方式从我的现有表中精确地过滤出使用在查询?
这里是我的表: departments_classes
| classes_vendors
| departments
| vendors
| classes
| products
| gateway
任何指导是不胜感激。
更多信息:有大约350个班和18个部门和12个网关页面...
你的分度表的想法听起来像它会工作得很好。唯一的缺点是你必须单独维护它,并且你想确保你在表中保存的数据不会在你现有的任何表中被复制。如果你不想维护这个数据比你现在这样做的不同,你可以使用CF的数组(或结构体)来保存相关数据(你必须从数据库中获取数据单独的查询),然后在构建查询时将其循环,以便为给定页面抽取类。
无论哪种方式会工作好,这是你喜欢怎么做了更多的事,你认为什么是最容易构建,测试和维护。
一件事效率 - 确保你不仅连接经由外键的表(这有助于保持数据的完整性),但也存在(非聚集)索引,这有助于效率的联接和查找您的查询将正在做。
我见过戏剧性速度改善我的查询(CFQUERYs对MS SQL操作)与投入指数的简单动作。
在MS SQL,你这样做是这样的:
CREATE NONCLUSTERED INDEX yourIndexName ON yourTableName(yourFieldName)
我希望这有助于!
您的问题听起来与确定用户权限的常见方案类似。用户可能属于某个拥有与其相关联的权限的用户组,或者用户可能会被单独分配权限。在你的情况下,用户是网关,集团是部门,权利是类。网关然后可以链接到任何数量的部门和/或类别。
采用这种模式,你只需要你用gateway_departments表格介绍了一起添加gateway_classes表。
然后,您可以使用UNION与“网关部门”查询(或可能的东西更优雅)合并“网关类”查询,但是我觉得这个模式将千方百计想让你需要不引入任何冗余信息。
非常好,谢谢。我结束了使用`CREATE TABLE classes_gateway LIKE departments_classes; INSERT classes_gateway SELECT * FROM department_classes;`然后添加一个`gateway_id`列。之后,我按部门订购了数据,在可能的情况下添加了适当的网关ID,然后返回并做了较小的“特定类别”更改。最后,我删除了部门信息,以便没有任何重复的数据。 – Ofeargall 2011-01-12 21:49:53
听起来像你得到它处理,然后!做得好! – 2011-01-12 22:00:45