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