0

我正在使用一个数据库,该数据库包含一个名为的表,该表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)
);

表中的ooommo和列包含一个逗号分隔的 id 列表,该模型与其具有指定的关系(即一对一、一对多等)。mmmodel_meta

当客户请求数据时,我得到的只是他们请求的表的名称(例如“库存”)——据此,我需要确定存在哪些关系并查询这些表以返回适当的结果集。

给定一个$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. 最后,从请求的表和与之相关的所有表中选择数据 - 请记住,我们可能正在处理一对一、一对多、多对一或多对-很多关系。对于这个具体的例子:

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

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

我的问题:有没有一种优雅的方式来组合这些查询中的任何一个,将它们的数量从 3 个减少到 2 个 - 甚至减少到一个查询?

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

4

0 回答 0