sql-server - azure logic app mysql




Stackoverflow의 "받은 편지함"과 유사한 기능을 빌드하는 데 권장되는 방법은 무엇입니까? (4)

다음과 같이 할 수 있습니다.

  1. 각 사용자 레코드에 저속 계산이 마지막으로 수행 된 날짜 / 시간 필드를 추가하십시오. LastDate 라고 부르세요 .
  2. 각 프로젝트에 나열되어야하는 경우 부울을 추가하십시오. 그것을 부름 : 선택됨
  3. Slow 프로 시저를 실행하면 Selected fileds를 업데이트합니다
  4. 이제 사용자가 LastDate 가 충분히 가까워 졌는지 기록하면 마지막으로 느린 계산 결과를 사용하고 Selected선택된 모든 프로젝트를 가져옵니다. 그렇지 않으면 느린 계산이 다시 시작됩니다. 위의 절차는 최적입니다. 왜냐하면 고정 된 간격으로 프로 시저를 실행하는 동안 느린 프로 시저를 다시 계산해야하기 때문에 실제로 필요한 경우에만 ... 사용자가 계산 결과를 사용하지 않기 때문에 시간 낭비의 위험이 있습니다.

나는 asp.net-mvc 웹 사이트를 가지고 있고 사람들은 프로젝트 목록을 관리한다. 일부 알고리즘을 기반으로 프로젝트가 오래되어 있는지 확인할 수 있습니다. 사용자가 로그인하면받은 편지함에 여러 개의 업데이트가있는 것과 비슷한 오래된 프로젝트의 수를 표시하고 싶습니다.

부실한 프로젝트를 계산하는 알고리즘은 다소 느립니다. 따라서 사용자가 로그인 할 때마다 :

  1. 소유자 인 모든 프로젝트에 대한 쿼리 실행
  2. IsStale () 알고리즘 실행
  3. 카운트를 IsStale = true로 표시합니다.

내 생각 엔 그게 진짜 느릴 것입니다. 또한, 모든 프로젝트 쓰기, 내가 변경된 경우 보려면 위의 재 계산해야 할 것입니다.

내가 가지고있는 또 다른 아이디어는 테이블을 만들고 부실한 프로젝트를 계산하고이 통계 테이블에 최신 개수를 저장하기 위해 모든 작업을 수 분간 실행하는 것이 었습니다. 그런 다음 사용자가 로그인 할 때 쿼리하십시오.이 테이블을 동기화 상태로 유지해야하며, 매분마다 한 번만 실행하는 경우 사람들이 프로젝트를 업데이트하면 1 분 후에 값이 변경되지 않습니다.

이받은 편지함 개념을 지원하여 검토 할 항목 수를 사용자에게 알리는 빠르고 확장 가능한 방법에 대한 아이디어?


당신은 이것을 할 수 있습니다 :

데이터베이스에서 사용자가 프로젝트에 액세스 할 때마다 타임 스탬프를 변경합니다. 사용자가 로그인하면 모든 프로젝트를 가져옵니다. 타임 스탬프를 확인하고 오늘 날짜와 비교하십시오. 날짜가 n 일 이상 지난 경우 오래된 날짜에 추가하십시오. 나는 날짜를 비교하는 것이 느린 논리를 초래할 것이라고 생각하지 않는다.


첫 번째 단계는 항상 적절한 요구 사항 분석입니다. 제가 프로젝트 매니저라고 가정합시다. 시스템에 로그인하면 제 프로젝트 가 정시 대로 표시됩니다. 개발자가 내 사무실에 와서 그의 활동이 지연된다고 알려줍니다. 개발자의 활동을 선택하고 기간을 변경합니다. 시스템은 제 시간에 프로젝트를 표시하므로, 일을 행복하게 떠납니다.

고객이 오전 3시에 프로젝트가 더 이상 정오 없는 이유를 묻는 전화를 받으면 어떻게 생각합니까? 시스템이 어떤 식 으로든 경고하지 않았기 때문에 확실히 놀랐습니다. 왜 그런 일이 일어 났습니까? 다음에 예정된 작업을 실행하여 프로젝트 상태를 업데이트하기 위해 30 초 (왜 1 초가 아닌가?)를 기다려야했기 때문입니다.

그것은 단지 해결책이 될 수 없습니다. IsStale() 프로세스를 실행하는 데 30 초가 걸리지 만 경고가 즉시 사용자에게 전송되어야합니다. 사용자에게 loading... 이미지 또는 다른 것을 표시하지만 사용자에게 정확한 데이터가 있는지 확인하십시오.

이제 구현과 관련하여 이전 호에서 벗어나기 위해 수행 할 수있는 작업은 없습니다. 일부 기한 변경에 영향을주는 작업이있을 때 해당 프로세스를 실행해야합니다. 그러나 할 수있는 일은 불필요하게 그 프로세스를 실행하는 것이 아닙니다. 예를 들어, 사용자가 로그인 할 때마다 실행할 수 있다고 언급했습니다. 2 명 이상의 사용자가 로그인하여 동일한 프로젝트를보고 아무 것도 변경하지 않으면 어떻게됩니까? 이 프로세스를 두 번 실행할 필요는 없습니다.

또한 사용자가 프로젝트를 업데이트 할 때 프로세스가 실행되는지 확인하면 다른 시간에 프로세스를 실행할 필요가 없습니다. 결론적으로이 스키마는 "폴링"솔루션과 비교하여 다음과 같은 장점과 단점이 있습니다.

장점

  • 예정된 직업 없음
  • 불필요한 프로세스는 실행되지 않습니다 (프로젝트에 dirty 플래그를 설정하고 그것이 true 일 경우에만 실행할 수 있기 때문에 이것은 논쟁의 여지가 true )
  • dirty 값에 대한 불필요한 쿼리가 없습니다.
  • 사용자는 항상 프로젝트의 현재 및 실제 상태 (현재까지 제공된 모든 솔루션에서 해결할 가장 중요한 항목 임)를 알게됩니다.

단점

  • 사용자가 프로젝트를 업데이트 한 다음 몇 초 만에 다시 업로딩하면 프로세스가 두 번 실행됩니다 (폴링 스키마에서 해당 프로세스가 스케줄 된 빈도에 따라 해당 기간에 한 번 실행되지 않을 수도 있음)
  • 프로젝트를 업데이트하는 사용자는 프로세스가 완료 될 때까지 기다려야합니다.

와 비슷한 방식으로 알림 시스템을 구현하는 방법으로 변경하는 것은 상당히 다른 질문입니다. 나는 사용자와 프로젝트와 다 - 대 - 다 관계가 있다고 생각합니다. 가장 간단한 해결책은 해당 엔티티 간의 관계에 단일 속성을 추가하는 것입니다 ( 중간 테이블 ).

Cardinalities : 사용자는 많은 프로젝트를 가지고 있습니다. 프로젝트에 많은 사용자가 있습니다.

그런 식으로 프로세스를 실행할 때 각 사용자의 Has_pending_notifications 를 새 결과로 업데이트해야합니다. 예를 들어, 사용자가 프로젝트를 업데이트하고 더 이상 시간 이 없으면 모든 사용자가 Has_pending_notifications 필드를 true 설정하여 상황을 인식하도록해야합니다. 마찬가지로 프로젝트가 정시에 false 설정하십시오. 프로젝트가 더 이상 정시에 없을 때 알림이 표시되도록하고 싶습니다.

예제를 통해 사용자가 알림을 읽을 때 플래그를 false 설정해야합니다. 사용자가 알림을 읽었는지 추측하기 위해 타임 스탬프를 사용하지 마십시오. 로그인하는 것은 읽는 알림을 의미하지 않습니다.

마지막으로 알림 자체가 복잡하면 사용자와 프로젝트 간의 관계에서 벗어나 다음과 같이 할 수 있습니다.

Cardinalities : 사용자는 많은 프로젝트를 가지고 있습니다. 프로젝트에는 많은 사용자가 있습니다. 사용자에게 많은 알림이 있습니다. 알림에는 한 명의 사용자가 있습니다. 프로젝트에 많은 알림이 있습니다. 알림에는 하나의 프로젝트가 있습니다.

내가 말했던 말이 뭔가 의미가 있었으면 좋겠다.


필드를 "부실"하게 만드십시오. stale = 0을 (모든 알고리즘이 true를 리턴하는) 모든 레코드로 stale = 1을 갱신하는 SQL 문을 실행하십시오. 그런 다음 stale = 1 인 모든 레코드를 선택하는 SQL 문을 실행하십시오.

이 작업이 빠르게 진행되는 이유는 PHP와 같은 SQL 구문 분석기가 첫 번째 절반이 true를 반환하면 AND 구문의 두 번째 절반을 수행하지 않아야하므로 전체 목록을 매우 빠르게 실행하고 모든 레코드를 검사하여 이미 부패하지 않은 상태에서 부실하게 만듭니다. 이미 부실한 경우 알고리즘이 실행되지 않아 시간이 절약됩니다. 그렇지 않은 경우 알고리즘이 실행되어 오래된 알고리즘이 있는지 확인한 다음 stale을 1로 설정합니다.

두 번째 쿼리는 stale = 1 인 모든 오래된 레코드를 반환합니다.





inbox