2011-03-01 54 views
3

我有一个表中有很多外键是引用相关表的字段。我正在用PHP编写一个脚本来执行数据库查询。当我查询这个表的数据时,我需要知道与这些键相关的值而不是键。基于外键加入表格

大多数人如何去做这件事?

这样做的101方法是查询此表的数据(包括外键),然后查询相关表以获取每个键的值。这可能是很多的疑问(〜10)。

问题1:我想我可以用一堆连接写1个查询。这会更好吗?

该方法还要求查询脚本知道哪些表字段是外键。由于我有很多像这样的表,但都有不同的字段,这意味着编写好的通用函数很难。 MySQL InnoDB表允许使用外部约束。我知道数据库已经正确设置了这些。

问题2:怎么样查询表和识别的约束是什么,然后用我决定不管过程从问题1:我喜欢这个想法,但从来没有看到它在代码中使用了他们匹配的念头。让我觉得它由于某种原因不是一个好主意。我会用SHOW CREATE TABLE tbl_name;找出该表格的约束/关系。

感谢您的任何建议或意见。

回答

1

你说的是写出“很好的泛型函数”,但我想你在这里想到的是一点TOO泛型。

就我个人而言,我只是写一个查询,其中有一堆连接。如果你想将所有连接逻辑抽象出来而不必担心,那么你应该看看使用ORM而不是直接写SQL。

0

在主数据表和查找表中,您正在使用什么样的记录计数?

作为一般规则,您应该将查找表加入主表。如果您的连接数量过多,并且这里涉及的UDF并不多,则表格应该更规范一些。如果规范化正常并且主数据表非常宽,那么您仍然可以将表分成具有1:1关系的多个表,以便将频繁访问的列与不常访问的列分开。

MySQL包含对ANSI目录INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS的支持。您可以使用它来收集有关FK关系的信息。

另外,如果您经常使用联接的组合,请根据这些常用操作创建视图或存储过程。

1

在某些级别,系统应该使用连接运行查询,无论这些查询是由应用程序员明确编写还是由data access layer自动生成。选项1肯定比天真选项好。至于其它的一些查询创建选项(决不是一个详尽的列表):

  • 你可以抽象出所有数据库操作,多为PDO抽象了连接和查询操作(即准备&执行查询)。使用它可以获取表元数据,包括外键,然后可以用它自动构造查询。
  • 您可以用其他格式(例如XML)编写对象规范,也可以使用它来生成PHP类和数据库表。与小型项目相比,您在企业应用程序中发现的更多这个选项比其他的开销更大,因此如果你只有几个类来建模,这个选项是不合适的。这个选项的发生也可能是Conway's Law的后果,我首先听到的是Richard Fairly的变体:“系统的结构反映了构建它的组织的结构。”
  • 你可以采取类似LINQ的方法。在PHP中,这意味着编写许多函数或方法,应用程序员可以将它们链接在一起,从而创建查询。应用程序员最终负责连接表,尽管他们自己从未写过JOIN

与其考虑如何创建查询,更好的问题方法是考虑如何连接数据库和应用程序。这导致patternsData MapperActive Record落入Object-Relational mappingORM)的类别。请注意,某些模式(如AR),其他ORM技术,甚至有其自身的问题。上述任何查询创建选项均可用于实现数据访问模式。

使用SHOW CREATE TABLE的问题是它不适用于大多数(所有?)其他RDBMS。如果你想把你的应用程序与MySQL结婚,继续,但这个决定可能会困扰你。