关系数据库结构设计建议

时间:2016-10-21 16:48:31

标签: database sqlite

这是我需要为应用程序创建数据库设计(使用SQLite)的数据的文本描述。

应用程序需要记录操作。每个操作都有一个名称及其参数列表。每个参数都有其名称和值。但是,参数的值将在应用程序的生命周期内发生变化(实际上用户将能够使用GUI更改它们),并且我们希望保留某个参数所具有的值的历史记录。此外,每个操作可以有多个参数集。参数集就像一个包含一组参数值的信封(它们都属于同一个操作),并为此信封提供唯一的数字和一个非唯一的描述

这就是我迄今为止所拥有的: [数据库模型图像] [1]

数据库模型应该允许我对数据库数据执行这些操作:

  1. 显示操作列表 - 我知道如何执行此操作。
  2. 显示给定操作的参数列表 - 我知道如何执行此操作。
  3. 对于给定的操作,将其所有参数显示为列,并将参数的值显示为行 - 每行表示与值历史记录不同的参数值。我被困在这一个。
  4. 对于给定的操作,显示属于该操作的所有参数集的列表。我也坚持这个。
  5. 对于给定的操作和给定的参数集,获取其参数的最新值。坚持这一点。
  6. 我不确定是否应该重新使用我的数据库模型,或者我是否应该使用我拥有的模型查找正确的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功能。谢谢。

1 个答案:

答案 0 :(得分:0)

0)我将ParameterSet连接到Operation和Parameter,而不是ParameterValue。

  • 1)好的!
  • 2)好的!
  • 3)我认为您可以使用COALESCE()函数显示列,然后应该可以显示匹配的OperationID的所有参数
  • 4)如果你点#0
  • ,你可以这样做
  • 5)与以上相同我认为