这个问题有几个部分。我在Python2.7中使用sqlite3,但我不太关心确切的语法,而是更关心需要使用的方法。我认为提出这个问题的最好方法是描述我当前的数据库设计,以及我正在努力实现的目标。一般来说,我不熟悉数据库,所以如果我不经常使用正确的命名法,我很抱歉。在
我正在为制冷系统建模(使用Modelica——不太重要),我使用数据库来管理输入数据、结果数据和用于这些数据的模型。在
我的顶层父表是Model
,它包含以下列:
id, name, version, date_created
我在Model
下的子表称为Design
。它用于为设计输入参数和所用模型的每个组合创建一个唯一的id。它包含的列有:
然后在Design
下有两个子表,一个名为Input
,另一个名为Result
。我们现在可以只看输入,因为一个例子就足够了。输入列为:
id, value, design_id, parameter_id, component_id
parameter_id
和{Parameter
表包含以下列:
id, name, units
一些Parameter under
name的示例行有:长度、宽度、速度、温度、压力(还有许多其他行)。组件表包含以下列:
id, name
name下Component
的一些示例行是:压缩机、热交换器、阀门。在
最后,在我的程序中,我想在数据库中搜索特定的设计。我希望能够搜索一个特定的设计,以便能够获取该设计的特定结果,或者知道以前是否已经运行过具有该设计的模型仿真,以避免重新运行相同的数据点。在
我还希望能够获取给定设计的所有参数,并将其插入到我用Python创建的类中,然后使用该类为模型提供输入。如果这有助于解决问题,我创建的类是基于组件的。例如,我有一个compressor类,它的属性如下压缩机速度, 压缩机冲程, 压缩机活塞尺寸. 每个属性在参数表中都应该有自己的行。在
那么,我如何高效地查询这个数据库,以确定是否有一个设计与一个长列表(假设100多个)参数相匹配?顺便说一句,我的朋友帮我设计了这个数据库。他对数据库了如指掌,但对我的应用程序却不甚了解。有可能是我设计的不好,我想完成的。在
下面是一张简单的图片,试图将具有特定值的某个参数组合映射到设计图上,为了简单起见,我去掉了组件的设计图:
只需连接必要的表。您的模式正确地反映了规范化(将表拆分为逻辑分组),并且可以扩展为一对多关系。具体地说,为了回答您的问题,我如何高效地查询这个数据库,以确定是否有一个设计与一长串(假设100多个)参数和特定值相匹配?考虑以下方法:
带Where子句的内部连接
对于少数参数,使用带有
WHERE...IN()
子句的内部联接。下面返回由input和参数表连接的design字段,这些字段针对特定的参数名进行过滤,在这些参数名中,甚至可以在循环中迭代地将Python传递为参数化值:如果长列表中的值超过100+,请考虑将参数表过滤为特定参数值的临时表:
^{pr2}$然后使用“新表”和“main表”联接“main表”:
同样的过程也可以用于组件表。在
*将图片移至问题部分
相关问题 更多 >
编程相关推荐