查找具有特定子行组合的父行SQLite与Python

2024-05-16 14:33:48 发布

您现在位置:Python中文网/ 问答频道 /正文

这个问题有几个部分。我在Python2.7中使用sqlite3,但我不太关心确切的语法,而是更关心需要使用的方法。我认为提出这个问题的最好方法是描述我当前的数据库设计,以及我正在努力实现的目标。一般来说,我不熟悉数据库,所以如果我不经常使用正确的命名法,我很抱歉。在

我正在为制冷系统建模(使用Modelica——不太重要),我使用数据库来管理输入数据、结果数据和用于这些数据的模型。在

我的顶层父表是Model,它包含以下列:

id, name, version, date_created

我在Model下的子表称为Design。它用于为设计输入参数和所用模型的每个组合创建一个唯一的id。它包含的列有:

^{pr2}$

然后在Design下有两个子表,一个名为Input,另一个名为Result。我们现在可以只看输入,因为一个例子就足够了。输入列为:

id, value, design_id, parameter_id, component_id

parameter_id和{}是它们自己的外键桌子。那个Parameter表包含以下列:

id, name, units 

一些Parameter undername的示例行有:长度、宽度、速度、温度、压力(还有许多其他行)。组件表包含以下列:

id, name

name下Component的一些示例行是:压缩机、热交换器、阀门。在

最后,在我的程序中,我想在数据库中搜索特定的设计。我希望能够搜索一个特定的设计,以便能够获取该设计的特定结果,或者知道以前是否已经运行过具有该设计的模型仿真,以避免重新运行相同的数据点。在

我还希望能够获取给定设计的所有参数,并将其插入到我用Python创建的类中,然后使用该类为模型提供输入。如果这有助于解决问题,我创建的类是基于组件的。例如,我有一个compressor类,它的属性如下压缩机速度, 压缩机冲程, 压缩机活塞尺寸. 每个属性在参数表中都应该有自己的行。在

那么,我如何高效地查询这个数据库,以确定是否有一个设计与一个长列表(假设100多个)参数相匹配?顺便说一句,我的朋友帮我设计了这个数据库。他对数据库了如指掌,但对我的应用程序却不甚了解。有可能是我设计的不好,我想完成的。在

下面是一张简单的图片,试图将具有特定值的某个参数组合映射到设计图上,为了简单起见,我去掉了组件的设计图:

Picture of simplified tables


Tags: 数据方法name模型id数据库参数model
1条回答
网友
1楼 · 发布于 2024-05-16 14:33:48

只需连接必要的表。您的模式正确地反映了规范化(将表拆分为逻辑分组),并且可以扩展为一对多关系。具体地说,为了回答您的问题,我如何高效地查询这个数据库,以确定是否有一个设计与一长串(假设100多个)参数和特定值相匹配?考虑以下方法:

带Where子句的内部连接

对于少数参数,使用带有WHERE...IN()子句的内部联接。下面返回由input参数表连接的design字段,这些字段针对特定的参数名进行过滤,在这些参数名中,甚至可以在循环中迭代地将Python传递为参数化值:

SELECT d.id, d.model_id, d.date_created
FROM design d
INNER JOIN input i ON d.id = i.design_id
INNER JOIN parameters p ON p.id = i.parameter_id
WHERE p.name IN ('param1', 'param2', 'param3', 'param4', 'param5', ...)

如果长列表中的值超过100+,请考虑将参数表过滤为特定参数值的临时表:

^{pr2}$

然后使用“新表”和“main表”联接“main表”:

SELECT d.id, d.model_id, d.date_created
FROM design d
INNER JOIN input i ON d.id = i.design_id
INNER JOIN tempparams t ON t.id = i.parameter_id 

同样的过程也可以用于组件表。在

*将图片移至问题部分

相关问题 更多 >