これは、アプリケーション用にデータベースデザイン(SQLiteを使用)を作成する必要のあるデータのテキスト記述です。リレーショナルデータベース構造設計アドバイス
アプリケーションは操作のレコードを保持する必要があります。各操作には、Nameとそのパラメーターのリストがあります。各パラメータには名前と値があります。しかし、パラメータの値はアプリケーションの存続期間にわたって変化します(実際にはユーザーはGUIを使用してパラメータを変更できます)。また、特定のパラメータが持つ値の履歴を保持する必要があります。さらに、各操作は複数のパラメータセットを持つことができます。パラメータセットは、パラメータ値のセット(すべてが同じ操作に属する)を包括するエンベロープのようなものであり、このエンベロープに固有の番号と一意ではないの説明を与えます。
これは私がそれまで持っているものです。 [データベースモデル画像] [1]
データベースモデルは、私は、データベースのデータにこれらのアクションを実行できるようにする必要があります。
- は、リストを表示操作の方法 - 私はこれを行う方法を知っています。
- 特定の操作のパラメータ一覧を表示する - これを行う方法はわかっています。
- 特定の操作では、すべてのパラメータを列として表示し、パラメータの値を行として表示します。各行は、値の履歴とは異なるパラメータ値を表します。私はこの1つで立ち往生しています。
- 特定の操作の場合、その操作に属するすべてのパラメーターセットのリストを表示します。私もこの1つで立ち往生しています。
- 与えられた操作と所定のパラメータセットについて、そのパラメータの最新の値を取得します。これで立ち往生してください。
データベースモデルを再作成する必要があるか、上記のタスクを実行するための適切なSQL文を探しているかどうかはわかりません。どんな助けでも大歓迎です。ありがとうございました。
EDIT 1
私は再び働いている私のdatabase model @Marekハーマンからの有益な助言に従いました。そのおかげで、私は仕事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文は、実際には、操作、パラメータ、ParameterSet、ParameterValue、ParameterValueVersionのPK-> FK関係ですべてのテーブルを結合し、指定されたOperationPLC_IDおよびParameterSetNumberで行をフィルタリングします。
ここには、このSQL文のexample of an outputがあります。各行には、パラメータの名前、その値、値のバージョン番号、およびその値の変更日が表示されます。一部のパラメータは1つの値しか持たない(1つのバージョン(例えば、 "OFFSET")のみ)。いくつかのパラメータには2つの値があります。たとえば、「PREFILLING」は2016年10月20日に入力された(バージョン番号1を持つ)「3」の値を持ち、2016年10月21日に入力された値「3.5」を持ち、バージョン2という数字です。そのため、パラメータの最新バージョンのみを表示したいと考えています。どのようにSQLステートメントを変更するアドバイスは非常に感謝しています。ありがとうございました。私は)5を実行する方法を考え出したと思い
EDIT 2
。私は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関数を研究するつもりです。ありがとうございました。
私はParameterSetをOperationに接続したと思いました。そうすれば、私は簡単に4)を達成することができますが、同時に、データベースに冗長性を導入します。これは、デ・ノーマライゼーション(悪い設計であることを示していますか?現在の設計では、操作を与えるために属するすべてのパラメータ記録を選択することによって、4)を達成することができる。次に、各Parameterに対してすべてのParameterValuesを選択し、すべての個別のParameterSetを選択します。これは私にとっては複雑な質問のようです。複雑なクエリや冗長性の導入など、何が正しいかわかりません。 –
ParameterSetをParameterデータテーブルに接続することも推奨しました。私はこれが理にかなっていると思う。ただし、これらの2つのテーブルの関係は、多対多です。これは、同じParameterが多数のParameterSetに属し、ParameterSetに多数のParametersが含まれる可能性があるためです。つまり、それは私が推測する補助データテーブルを導入することを意味します。私はまず、MS Accessでモデル化しようとしています。私はそれで前述の関数を実装できるかどうかを見ていきます。これまでにありがとうございました。 –