我有一个表有很多字段,这些字段是引用相关表的外键。我正在用PHP编写一个脚本来执行数据库查询。当我查询该表的数据时,我需要知道与这些键相关的值而不是键。
大多数人如何解决这个问题?
执行此操作的101方法是查询此表以查找包含外键的数据,然后查询相关表以获取每个键的值。这可能是很多查询(~10)。
问题1:我想我可以用一堆连接写一个查询。会更好吗?
此方法还要求查询脚本知道哪些表字段是外键。由于我有很多像这样的表,但都有不同的字段,这意味着编写好的通用函数很难。 MySQL InnoDB表允许外部约束。我知道数据库已经正确设置了这些。
问题2:查询表格并确定约束条件的想法如何,然后使用我在问题1中决定的任何过程来匹配它们。我喜欢这个想法但从未看过它在代码中使用。让我认为出于某种原因这不是一个好主意。我会使用像SHOW CREATE TABLE tbl_name这样的东西;找到该表存在哪些约束/关系。
感谢您提出任何建议或意见。
答案 0 :(得分:1)
你谈到编写“漂亮的通用函数”,但我认为你在想这里有点太通用了。
就个人而言,我只想写一个包含大量连接的查询。如果你想抽象出所有加入逻辑的东西而不必担心它,那么你应该考虑使用ORM而不是直接编写SQL。
答案 1 :(得分:1)
在某种程度上,系统应使用连接运行查询,无论这些查询是由应用程序员明确编写还是由data access layer自动生成。选项1明显优于天真选项。至于其他一些查询创建选项(绝不是详尽的列表):
JOIN
。更好的问题方法是考虑如何连接数据库和应用程序,而不是考虑如何创建查询。这会导致patterns和Data Mapper等Active Record属于Object-Relational mapping(ORM)类别。请注意,某些模式(例如AR),其他ORM技术甚至ORM itself都有自己的问题。任何上述查询创建选项都可用于实现数据访问模式。
使用SHOW CREATE TABLE
的问题是它不适用于大多数(所有?)其他RDBMS。如果你想将你的应用程序与MySQL结合,请继续,但这个决定可能会困扰你。
答案 2 :(得分:0)
您在主数据表和查找表中使用了哪些记录计数?
作为一般规则,您应该将查找表连接到主表。如果你有大量的连接,并且这里没有涉及很多UDF,那么表格应该更加规范化了。如果规范化很好并且主数据表非常宽,您仍然可以将表拆分为多个具有1:1关系的表,以便将经常访问的列与不经常访问的列分开。
MySQL包括对ANSI目录INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS的支持。您可以使用它来收集有关存在的FK关系的信息。
此外,如果您经常使用联接组合,请根据这些常见操作创建视图或存储过程。