문제

에서 일하고 있어요 업그레이드를 위해 기존 데이터베이스 설계없이 모든 코드의 구현하는 디자인을 고려하고 있습니다.지금 나는 벽돌 벽의 측면에서 구현하는 데이터베이스 디자인 코드.나는 여부에 문제가 디자인의 데이터베이스는 경우 또는 나는 단순히 정보가 정확하지 않은 솔루션하는 방법에는 무엇을 해야 합니다.

기본 논리 규정 다음과 같다:

  1. 사용자 액세스 온라인 교육 방법에 의해의 좌석입니다.사용자는 여러 좌석입니다.
  2. 좌석을 구매한 회사 및 다과의 관계를 제품입니다.
  3. 제품는 많은 관계와 모듈을 사용합니다.
  4. 모듈 많은 관계와 수업입니다.
  5. 수업은 최종 사용자 접근을 위해 그들의 훈련.
  6. 하는 진흙 투성이의 물이,이유 중 하나 또는 다른 일부 사용자가 여러 좌석을 포함하는 동일한 제품입니다.
  7. 인증에서 일어난 제품 기준,지용 기준입니다.
  8. 사용자가 많은 관계에 있는 교훈으로 저장하는 그들의 현재 상태 또는 점수를 위한 교훈입니다.
  9. 사용자는 증명에 대 한 제품을 완료 할 때 모든 수업에서는 모든 모듈에 대한 제품입니다.
  10. 그것은 또한 상당한 때를 알고 모든 수업은 특정 모듈에 의해 완성된 사용자.
  11. 일부의 좌석이 될 것입에 대한 재인증을 의미하는 사용자는 이전에 인증된 제품에 대한 등록할 수 있습을 재인증 시험을 한다.
  12. 때문에 규칙 11,사용자가가 할 수있는 여러 인증 기록합니다.
  13. 편집:사용자가 완료하면 공과(점수 보다 더 나은 80%)사용자가(에 따라 현재 비즈니스 논리)완료 수업에 대한 모든 제품을 모든 좌석을 포함하는 교훈이다.

문제는 내가 계속 실행으로 현재 디자인 및 사업 논리로 나가 더 많거나 적은 그것을 설명 할 수있는 방법을 찾을 효과적으로 넥타이지 사용자 인증을 위해 특정 제품 및 좌석 vs 때 그들은하지 않습니다.을 차질을 설정하려고 시도하는 제품에는 좌석이 인증되었습에 대한 사용자는하지 않았습니다.문제의 일부이기 때문에 그들은 경우에 현재 등록에 대한 여러 개의 동일한 제품에서 다른 좌석,다음을 포함하고 제품 번만 합니다.

아래에 복사하는 부분의 스키마에의 참여입니다.어떤 제안을 개선하는 방법에 대한 디자인을 그리거나 연결 코드에서 평가될 것입니다.는 경우 그것은 중요한,이 사이트에 내장되어 LAMPP 스택입니다.

당신이 볼 수 있는 관련 부분을 데이터베이스의 스키마에 여기: http://lpsoftware.com/problem_db_structure.png

도움이 되었습니까?

해결책

당신이 찾고있는 것은입니다 관계 부문SQL에서 직접 구현되지는 않지만 수행 할 수 있습니다. 다른 예제는 Google을 검색하십시오.

다른 팁

스키마를 간단히 살펴본 후에는 당신이 할 수있는 일 중 하나는 'to_be_certified'테이블을 만드는 것입니다. 제품을 시트에 할당 할 때 (Product_Seat_rtab가 채워질 때) user_id, product_id 및 seat_id로 채우십시오.

Certification_RTAB 테이블에 레코드를 추가하면 'TO_BE_CERTIFIED'테이블에서 해당 레코드를 삭제하십시오. 이를 통해 사용자를 위해 인증 된 모든 제품과 그렇지 않은 제품에 쉽게 액세스 할 수 있습니다.

Deplicate Product_ids를 제거하려면 Product_id로 그룹화 할 수 있습니다.

필요하신을 변경하 lessonstatus_rtab 테이블:

CREATE TABLE lessonstatus_rtab (
  user_id    INT NOT NULL,
  seat_id    INT NOT NULL,
  lesson_id  INT NOT NULL REFERENCES lesson_rtab,
  accessdate TIMESTAMP,
  score      NUMERIC(5,2) NOT NULL DEFAULT 0,
  PRIMARY KEY (user_id, seat_id, lesson_id),
  FOREIGN KEY (user_id, seat_id) REFERENCES user_seat_rtab (user_id, seat_id)
);

다음 쿼리할 수 있는 각 제품에 대한 사용자는 좌석을 위해,그는 인증을 받았습니까?이는 수업의 수가 그 득점,말,50%이상이 동일한 수로의 수업에서는 모든 모듈에 대한 제품입니다.

SELECT p.name, us.user_id, us.seat_id, COUNT(l.id) = COUNT(lu.lesson_id) AS is_certified
FROM user_seat_rtab AS us
 JOIN seat_rtab AS s ON (s.id = us.seat_id)
 JOIN product_seat_rtab AS ps ON (ps.seat_id = s.id)
 JOIN product_rtab AS p ON (p.id = ps.product_id)
 JOIN product_module_rtab AS pm ON (pm.product_id = p.id)
 JOIN module_rtab AS m ON (m.id = pm.module_id)
 JOIN module_lesson_rtab AS ml ON (ml.module_id = m.id)
 JOIN lesson_rtab AS l ON (l.id = ml.lesson_id)
 LEFT OUTER JOIN lessonstatus_rtab AS lu 
   ON (lu.lesson_id = l.id AND lu.user_id = us.user_id 
     AND lu.seat_id = us.seat_id AND lu.score > 0.50)
GROUP BY p.id, us.user_id, us.seat_id;

업데이트:

이 문제를 더 고려했으며 단순히 user_seat_rtab 테이블을 제거한 다음 동등한 인증 _rtab 테이블 (아마도 이름이 변경)을 사용하여 사용자 좌석 상태에 관한 모든 정보를 보유하는 것이 더 잘 작동하는지 여부를 고려했습니다. 이런 식으로 사용자, 좌석, 좌석 내 각 제품 및 사용자가 특정 제품 및 좌석에 대한 인증을 받았는지 여부간에 직접적인 관계가 설정되어 있습니다.

따라서 다음과 같은 변경 사항을 질문과 함께 게시 한 스키마에 적용합니다.

DROP TABLE user_seat_rtab;
RENAME TABLE certification_rtab TO something_different;

이 새로운 구조를 더 정상화하기위한 대안은 다음과 같은 일을하는 것입니다.

ALTER TABLE user_seat_rtab 
    DROP PRIMARY KEY;
    ADD COLUMN product_id int(10) unsigned NOT NULL;
    ADD CONSTRAINT pk_user_seat_product PRIMARY KEY (user_id, seat_id, product_id);
    ADD CONSTRAINT fk_product_user_seat FOREIGN KEY (product_id) REFERENCES product_rtab(id) ON DELETE RESTRICT;

나는 이것이 문제를 해결할 것인지 아니면 새로운 문제를 소개하면서 문제의 본질을 약간 바꿀지 확실하지 않습니다. 그렇다면 다른 비판이나 제안이 있습니까?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top