2016-10-21 9 views
1

これは、アプリケーション用にデータベースデザイン(SQLiteを使用)を作成する必要のあるデータのテキスト記述です。リレーショナルデータベース構造設計アドバイス

アプリケーションは操作のレコードを保持する必要があります。各操作には、Nameとそのパラメーターのリストがあります。各パラメータには名前と値があります。しかし、パラメータの値はアプリケーションの存続期間にわたって変化します(実際にはユーザーはGUIを使用してパラメータを変更できます)。また、特定のパラメータが持つ値の履歴を保持する必要があります。さらに、各操作は複数のパラメータセットを持つことができます。パラメータセットは、パラメータ値のセット(すべてが同じ操作に属する)を包括するエンベロープのようなものであり、このエンベロープに固有の番号と一意ではないの説明を与えます。

これは私がそれまで持っているものです。 [データベースモデル画像] [1]

データベースモデルは、私は、データベースのデータにこれらのアクションを実行できるようにする必要があります。

  1. は、リストを表示操作の方法 - 私はこれを行う方法を知っています。
  2. 特定の操作のパラメータ一覧を表示する - これを行う方法はわかっています。
  3. 特定の操作では、すべてのパラメータを列として表示し、パラメータの値を行として表示します。各行は、値の履歴とは異なるパラメータ値を表します。私はこの1つで立ち往生しています。
  4. 特定の操作の場合、その操作に属するすべてのパラメーターセットのリストを表示します。私もこの1つで立ち往生しています。
  5. 与えられた操作と所定のパラメータセットについて、そのパラメータの最新の値を取得します。これで立ち往生してください。

データベースモデルを再作成する必要があるか、上記のタスクを実行するための適切な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関数を研究するつもりです。ありがとうございました。

答えて

0

0)ParameterSetをOperationとParameterに、ParameterValueには接続しません。

  • 1)大丈夫です!
  • 2)大丈夫です!
  • 3)私はあなたのポイント#0
  • をすれば、あなたがそれを行うことができます)あなたが列を表示するようにして、OperationID
  • 4に一致すると、すべてのパラメータを表示することが可能ですCOALESCE()関数を使用することができると思います5)上記と同じです。
+0

私はParameterSetをOperationに接続したと思いました。そうすれば、私は簡単に4)を達成することができますが、同時に、データベースに冗長性を導入します。これは、デ・ノーマライゼーション(悪い設計であることを示していますか?現在の設計では、操作を与えるために属するすべてのパラメータ記録を選択することによって、4)を達成することができる。次に、各Parameterに対してすべてのParameterValuesを選択し、すべての個別のParameterSetを選択します。これは私にとっては複雑な質問のようです。複雑なクエリや冗長性の導入など、何が正しいかわかりません。 –

+0

ParameterSetをParameterデータテーブルに接続することも推奨しました。私はこれが理にかなっていると思う。ただし、これらの2つのテーブルの関係は、多対多です。これは、同じParameterが多数のParameterSetに属し、ParameterSetに多数のParametersが含まれる可能性があるためです。つまり、それは私が推測する補助データテーブルを導入することを意味します。私はまず、MS Accessでモデル化しようとしています。私はそれで前述の関数を実装できるかどうかを見ていきます。これまでにありがとうございました。 –

関連する問題