自动从相关表中检索数据

时间:2013-03-05 22:01:43

标签: mysql

我正在使用一个包含名为model_meta的表的数据库,该表包含有关应用程序使用的所有各种模型的元数据。以下是相关的数据结构:

CREATE TABLE model_meta (
  id INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
  name VARCHAR(64),
  oo INT(11),
  om INT(11),
  mo INT(11),
  mm INT(11),
  INDEX (name)
);

CREATE TABLE inventory (
  id INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
  type VARCHAR(255),
  customers_id INT(11)
);

CREATE TABLE customers (
  id INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
  name VARCHAR(255),
  contact VARCHAR(255)
);

oo表中的列ommommmodel_meta包含逗号分隔的ID列表,该模型具有该ID指定的关系(即一对一,一对多等)。

当客户端请求数据时,我给出的只是他们请求的表的名称(例如“库存”) - 从那里,我需要确定存在什么关系并查询这些表以返回适当的结果集。

给定一个包含所请求模型名称的变量(我们称之为$input),以下是步骤:

  1. 获取模型元数据:SELECT model_meta.* FROM model_meta WHERE model_meta.name = $input;

  2. 确定关系列(oo,om,mo,mm)中的哪些(如果有)包含值 - 请记住它们可以包含以逗号分隔的值列表。

  3. 使用步骤2中的值来确定相关模型的名称 - 例如,我们只说mo只包含一个值,我们将引用它为$mo

    所以:SELECT model_meta.name FROM model_meta WHERE model_meta.id = $mo;

    我们将此结果称为$related

  4. 最后,从请求的表中选择数据以及与之相关的所有表 - 请记住,我们可能正在处理一对一,一对多,多对一,或多对多的关系。对于这个具体的例子:

    在psuedo-SQL中:SELECT $input.*, $related.* FROM $input LEFT JOIN $related ON ($related.id = $input.$related_id);

  5. 此方法使用三个单独的查询 - 第一个用于收集有关所请求表的元数据,第二个用于收集相关表的名称,第三个用于查询这些表并返回实际数据。

    我的问题:是否有一种优雅的方式来组合这些查询,将其数量从3减少到2 - 甚至减少到一个查询?

    当然,真正的目标是以某种方式自动从相关表中检索数据(客户端不必知道表是如何相关的)。这就是目标。

0 个答案:

没有答案