2016-10-21 2 views
1

이것은 응용 프로그램에 대해 (SQLite를 사용하여) 데이터베이스 디자인을 작성해야하는 데이터의 텍스트 설명입니다.관계형 데이터베이스 구조 디자인 조언

응용 프로그램은 조작의 레코드를 유지해야합니다. 각 작업에는 이름과 매개 변수 목록이 있습니다. 각 매개 변수에는 이름과 값이 있습니다. 그러나 매개 변수의 값은 앱의 수명 기간 동안 변경됩니다 (실제로 사용자는 GUI를 사용하여 매개 변수를 변경할 수 있습니다). 그리고 특정 매개 변수가 가진 값의 기록을 유지하려고합니다. 또한 각 작업에는 복수 매개 변수 집합이있을 수 있습니다. 매개 변수 집합은 매개 변수 값 집합 (모두 동일한 연산에 속함)을 포함하는 봉투와 같으며이 봉투에 고유 한 번호과 고유하지 않은 설명을 제공합니다.

내가 이제까지의 무엇을 가지고 : [데이터베이스 모델 이미지] [1]

데이터베이스 모델은 나를 데이터베이스 데이터에 이러한 작업을 수행 할 수 있도록해야합니다

  1. 이 목록을 표시합니다 작업 방법 -이 작업 방법을 알고 있습니다.
  2. 특정 작업에 대한 매개 변수 목록을 표시합니다.이 작업을 수행하는 방법을 알고 있습니다.
  3. 주어진 작업에 대해 모든 매개 변수를 열로 표시하고 매개 변수 값을 행으로 표시합니다. 각 행은 값 기록에서 다른 매개 변수 값을 나타냅니다. 나는이 하나에 붙어있다.
  4. 주어진 조작에 대해, 해당 조작에 속하는 모든 매개 변수 세트의 목록을 표시하십시오. 나는 이것도 붙어있다.
  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 문은 실제로 PK-> FK 관계에있는 모든 테이블을 Operation, Parameter, ParameterSet, ParameterValue, ParameterValueVersion과 조인하고 지정된 OperationPLC_ID 및 ParameterSetNumber에 의해 행을 필터링합니다.

다음은이 SQL 문의 example of an output입니다. 각 행은 매개 변수의 이름, 값, 값의 버전 번호 및 해당 값의 변경 날짜를 보여줍니다. 일부 매개 변수에는 하나의 값만 있습니다 (예 : "OFFSET"). 일부 매개 변수에는 두 개의 값이 있습니다. 예를 들어 'PREFILLING'의 값은 2016 년 10 월 20 일 (버전 번호 1)이고 2016 년 10 월 21 일에 입력 된 '3.5'값을 가지며 버전이 '3'입니다. number of 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 

이제는 작업 번호를 수행하는 방법을 알아야합니다. 3. 나는 제안 된 COALESCE 함수를 연구 할 것이다. 고맙습니다.

답변

0

0) 나는 ParameterValue가 아닌 Operation과 Parameter에 ParameterSet을 연결합니다.

  • 1) 좋습니다!
  • 2) 알았어요!
  • 3) 당신이 할 수있는) 나는 당신이 열을 표시하기 위해 COALESCE() 함수를 사용할 수 있다고 생각하고
  • 4 OperationID
  • 일치하는 모든 매개 변수를 표시 할 수 있어야 당신은 포인트 # 0
  • 을 할 경우 5) 위와 같음
+0

나는 ParameterSet을 Operation에 연결하는 것을 생각했다. 그렇게하면 쉽게 4)를 달성 할 수 있지만, 동시에 데이터베이스에 중복성을 도입하게됩니다. 즉, 비정규 화 (이는 나쁜 설계를 나타냅니다. 그렇지 않습니까?)를 의미합니다. 현재 설계에서, 4)는 조작을 제공하기 위해 속하는 모든 매개 변수 레코드를 선택하여 수행 할 수 있습니다. 그런 다음 각 Parameter에 대해 ParameterValue를 모두 선택하고 모든 ParameterSet을 선택하십시오. 이것은 나에게 복잡한 질의처럼 들린다. 복잡한 쿼리를 사용하거나 중복성을 도입하는 것이 옳은 것인지 잘 모르겠습니다. –

+0

또한 ParameterSet을 매개 변수 데이터 테이블에 연결하는 것이 좋습니다. 나는 이것이 합리적이라고 생각한다. 그러나이 두 테이블의 관계는 many-to-many입니다. 동일한 Parameter가 많은 ParameterSet에 속할 수 있고 ParameterSet에 수많은 Parameters가 포함될 수 있기 때문입니다. 그래서 그것은 내가 추측하는 보조 데이터 테이블을 도입하는 것을 의미 할 것입니다. 나는 MS Access에서 먼저 모델을 만들려고 노력할 것이고 언급 된 기능을 구현할 수 있는지를 알게 될 것이다. 지금까지 대단히 감사합니다. –

관련 문제