我有一个表,其中有许多字段是引用相关表的外键。我正在用PHP编写一个脚本来执行db查询。当我查询这个表的数据时,我需要知道与这些键相关的值,而不是键。
大多数人怎么做这件事?
要做到这一点,101种方法是查询该表的数据(包括外键),然后查询相关表以获取每个键的值。这可能是很多查询(~10)。
问题1: --我想我可以用一堆联接编写一个查询。这样会更好吗?
这种方法还要求查询脚本知道哪些表字段是外键。因为我有很多这样的表,但都有不同的字段,这意味着编写好的泛型函数很困难。MySQL InnoDB表允许外部约束。我知道数据库的设置是正确的。
问题2:,关于查询表和确定约束是什么,然后使用我从问题1中决定的任何过程来匹配约束的想法,我喜欢这个想法,但从未看到它在代码中被使用。让我觉得出于某种原因这不是个好主意。我将使用类似于显示CREATE tbl_name;来查找该表存在哪些约束/关系。
感谢您的任何建议或建议。
发布于 2011-03-01 21:18:20
您谈到了编写“很好的泛型函数”,但我认为您在这里有点过于通用了。
就我个人而言,我只需要编写一个包含大量连接的查询。如果您想抽象出所有的连接逻辑,而不必担心它,那么您可能应该考虑使用ORM,而不是直接编写SQL。
发布于 2011-03-01 23:09:23
在某种程度上,系统应该使用联接运行查询,无论这些查询是由应用程序程序员显式编写的还是由数据访问层自动生成的。选项1显然比朴素的选项要好。至于其他一些查询创建选项(绝不是详尽的列表):
JOIN。更好的问题方法不是考虑如何创建查询,而是考虑如何将DB与应用程序接口。这导致了模式,如数据映射器和活动记录,它们属于对象-关系映射 (奥姆)范畴。请注意,一些模式(如AR)、其他ORM技术甚至ORM本身都有自己的问题。上述任何查询创建选项都可以用于实现数据访问模式。
使用SHOW CREATE TABLE的问题是它不适用于大多数(全部?)其他RDBMS。如果你想把你的应用程序和MySQL结合起来,那就去吧,但是这个决定可能会困扰你。
发布于 2011-03-01 22:59:56
在主数据表和查找表中使用的记录计数是什么?
通常情况下,您应该将查找表连接到主表。如果您有过多的连接,并且这里涉及的UDF不多,那么很有可能表会被规范化一些。如果规范化很好,并且主数据表非常宽,则仍然可以将表拆分为具有1:1关系的多个表,以便将频繁访问的列与不经常访问的列分开。
MySQL包括对ANSI目录INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS的支持。您可以使用它来收集有关存在的FK关系的信息。
此外,如果经常使用联接的组合,则根据这些常见操作创建视图或存储过程。
https://stackoverflow.com/questions/5160409
复制相似问题