基于外键加入表

时间:2011-03-01 21:12:51

标签: mysql database foreign-keys relational-database

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

大多数人如何解决这个问题?

执行此操作的101方法是查询此表以查找包含外键的数据,然后查询相关表以获取每个键的值。这可能是很多查询(~10)。

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

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

问题2:查询表格并确定约束条件的想法如何,然后使用我在问题1中决定的任何过程来匹配它们。我喜欢这个想法但从未看过它在代码中使用。让我认为出于某种原因这不是一个好主意。我会使用像SHOW CREATE TABLE tbl_name这样的东西;找到该表存在哪些约束/关系。

感谢您提出任何建议或意见。

3 个答案:

答案 0 :(得分:1)

你谈到编写“漂亮的通用函数”,但我认为你在想这里有点太通用了。

就个人而言,我只想写一个包含大量连接的查询。如果你想抽象出所有加入逻辑的东西而不必担心它,那么你应该考虑使用ORM而不是直接编写SQL。

答案 1 :(得分:1)

在某种程度上,系统应使用连接运行查询,无论这些查询是由应用程序员明确编写还是由data access layer自动生成。选项1明显优于天真选项。至于其他一些查询创建选项(绝不是详尽的列表):

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

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

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

答案 2 :(得分:0)

您在主数据表和查找表中使用了哪些记录计数?

作为一般规则,您应该将查找表连接到主表。如果你有大量的连接,并且这里没有涉及很多UDF,那么表格应该更加规范化了。如果规范化很好并且主数据表非常宽,您仍然可以将表拆分为多个具有1:1关系的表,以便将经常访问的列与不经常访问的列分开。

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

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