这是我需要为应用程序创建数据库设计(使用SQLite)的数据的文本描述。
应用程序需要记录操作。每个操作都有一个名称及其参数列表。每个参数都有其名称和值。但是,参数的值将在应用程序的生命周期内发生变化(实际上用户将能够使用GUI更改它们),并且我们希望保留某个参数所具有的值的历史记录。此外,每个操作可以有多个参数集。参数集就像一个包含一组参数值的信封(它们都属于同一个操作),并为此信封提供唯一的数字和一个非唯一的描述
这就是我迄今为止所拥有的: [数据库模型图像] [1]
数据库模型应该允许我对数据库数据执行这些操作:
我不确定是否应该重新使用我的数据库模型,或者我是否应该使用我拥有的模型查找正确的SQL语句来完成上述任务。任何帮助是极大的赞赏。谢谢。
编辑1
根据@Marek Herman的有用建议,我已经重新设计了我的database model。由于我能够完成任务1)2)4)。 现在我试图完成5)当前的数据库模型不应该那么困难。我有这个SQL语句:
SELECT Parameter.ParameterIdentifier, ParameterValue.ParameterValue,
ParameterValueVersion.VersionNumber, ParameterValueVersion.ChangedOn
FROM ParameterValueVersion INNER JOIN
(((Operation INNER JOIN Parameter ON Operation.OperationPLC_ID = Parameter.OperationPLC_ID)
INNER JOIN ParameterSet ON Operation.OperationPLC_ID = ParameterSet.OperationPLC_ID)
INNER JOIN ParameterValue ON (ParameterSet.ID = ParameterValue.ParameterSetID) AND
(Parameter.ID = ParameterValue.ParameterID)) ON ParameterValueVersion.ID = ParameterValue.ParameterValueVersionID
WHERE (Operation.OperationPLC_ID=[opID] AND
ParameterSet.ParameterSetNumber=[parSetNum]);
其中[opID]和[parSetNum]是输入参数。这个SQL语句实际上只在它们的PK-> FK关系上将所有这些表连接在一起:Operation,Parameter,ParameterSet,ParameterValue,ParameterValueVersion,并按指定的OperationPLC_ID和ParameterSetNumber过滤行。
这是此SQL语句的example of an output。每行显示参数的名称,其值,值的版本号和该值的更改日期。一些参数只有一个值(只有一个版本-e.g。," OFFSET")。一些参数有两个值。例如" PREFILLING"的值为" 3"这是在2016年10月20日输入的(版本号为1),其值为" 3.5"这是在2016年10月21日输入的,版本号为2.因此,我只想显示参数值的最新版本。任何建议如何修改SQL语句非常感谢。谢谢。
编辑2
我想我想出了如何执行5)。我必须研究GROUP BY的工作原理。这就是诀窍:
SELECT Parameter.ParameterIdentifier, last(ParameterValue.ParameterValue) AS ParameterValue, last(ParameterValueVersion.ChangedOn) AS ChangedOn, max(ParameterValueVersion.VersionNumber) AS VersionNumber
FROM ParameterValueVersion INNER JOIN
(((Operation INNER JOIN Parameter ON Operation.OperationPLC_ID = Parameter.OperationPLC_ID)
INNER JOIN ParameterSet ON Operation.OperationPLC_ID = ParameterSet.OperationPLC_ID)
INNER JOIN ParameterValue ON (ParameterSet.ID = ParameterValue.ParameterSetID) AND
(Parameter.ID = ParameterValue.ParameterID)) ON ParameterValueVersion.ID = ParameterValue.ParameterValueVersionID
WHERE (((Operation.OperationPLC_ID)=[opID]) AND ((ParameterSet.ParameterSetNumber)=[parSetNum]))
GROUP BY Parameter.ParameterIdentifier
ORDER BY Parameter.ParameterIdentifier
现在我仍然需要弄清楚如何执行任务号。我将研究建议的COALESCE功能。谢谢。
答案 0 :(得分:0)
0)我将ParameterSet连接到Operation和Parameter,而不是ParameterValue。