我正在使用一个数据库,该数据库包含一个名为的表,该表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
、om
、mo
和列包含一个逗号分隔的 id 列表,该模型与其具有指定的关系(即一对一、一对多等)。mm
model_meta
当客户请求数据时,我得到的只是他们请求的表的名称(例如“库存”)——据此,我需要确定存在哪些关系并查询这些表以返回适当的结果集。
给定一个$input
包含请求模型名称的变量(我们称之为它),以下是步骤:
获取模型元数据:
SELECT model_meta.* FROM model_meta WHERE model_meta.name = $input;
确定关系列(oo、om、mo、mm)中的哪些(如果有)包含值 - 请记住,它们可以包含以逗号分隔的值列表。
使用步骤 2 中的值来确定相关模型的名称 - 例如,假设它只
mo
包含一个值,我们将其称为$mo
.所以:
SELECT model_meta.name FROM model_meta WHERE model_meta.id = $mo;
我们称之为结果
$related
。最后,从请求的表和与之相关的所有表中选择数据 - 请记住,我们可能正在处理一对一、一对多、多对一或多对-很多关系。对于这个具体的例子:
在伪 SQL 中:
SELECT $input.*, $related.* FROM $input LEFT JOIN $related ON ($related.id = $input.$related_id);
此方法使用三个单独的查询 - 第一个收集有关请求表的元数据,第二个收集相关表的名称,第三个查询这些表并返回实际数据。
我的问题:有没有一种优雅的方式来组合这些查询中的任何一个,将它们的数量从 3 个减少到 2 个 - 甚至减少到一个查询?
当然,真正的目标是以某种方式自动从相关表中检索数据(而客户端不必知道这些表是如何相关的)。这就是目标。