이 질문은 실제로 데이터 모델이 하나로 통합 된 많은 문제입니다. 한 번에 하나씩 풀어야합니다. 퍼즐의 각 부분을 단순화하려고하면보다 자연스럽고 직관적 인 솔루션이 사라집니다.
문제 1 : DB 주문에 의존 할 수 없음
데이터 정렬에 대한 설명이 명확하지 않습니다.
- 가장 큰 잠재적 문제는
ORDER BY
절을 통해 데이터베이스에서 명시 적 정렬을 지정하지 않는다는 것 입니다. 너무 비싸 보이기 때문에 프로그램 에 버그가 있습니다. 데이터베이스를 지정하지 않으면 데이터베이스는 어떤 순서 로도 결과를 반환 할 수 있습니다. 쿼리를 몇 번 실행했기 때문에 순서대로 데이터를 반환하는 것에 의존 할 수는 없습니다. 행이 디스크에서 재 배열되거나 일부가 삭제되고 새로운 행이 대신되거나 인덱스가 추가되므로 순서가 변경 될 수 있습니다. 당신은 해야한다 를 지정ORDER BY
어떤 종류의 절을. 속도는 정확하지 않으면 무가치합니다.
- 게재 신청서가 중요하다는 의미도 명확하지 않습니다. 당신이 데이터베이스 자체에 대해 이야기하는 경우, 당신은 해야한다 실제로이를 추적하는 열이, 그것은 해야 당신에 포함
ORDER BY
절. 그렇지 않으면 버그가 있습니다. 이러한 열이 아직 없으면 열을 추가해야합니다. 이와 같은 열의 일반적인 옵션은 삽입 타임 스탬프 열 또는 자동 증분 키입니다. 자동 증분 키가 더 안정적입니다.
문제 2 : 메모리 정렬 효율화
원하는 순서대로 데이터를 반환 한다고 보장 되면 이 사실을 활용하여 메모리 정렬을 훨씬 효율적으로 수행 할 수 있습니다. 쿼리 결과 집합에 row_number()
또는dense_rank()
열 (또는 데이터베이스의 해당 항목)을 추가하기 만하면 됩니다. 이제 각 행에는 순서가 무엇인지에 대한 직접적인 표시를 제공 하는 색인 이 있으며 메모리에서 이것을 간단하게 정렬 할 수 있습니다. 색인에 의미있는 이름 (예 :)을 지정하십시오 sortedBySomethingIndex
.
비올라. 이제 더 이상 데이터베이스 결과 집합 순서에 의존 할 필요가 없습니다.
문제 3 : 코드에서이 처리를해야합니까?
SQL은 실제로 정말 강력한. 데이터에 대해 많은 변환과 집계를 수행 할 수있는 놀라운 선언적 언어입니다. 오늘날 대부분의 DB는 행간 작업을 지원합니다. 이를 창 또는 분석 함수라고합니다.
당신도 마십시오 필요가 같은 메모리에 데이터를 끌어? 아니면 창 함수를 사용하여 SQL 쿼리에서 모든 작업을 수행 할 수 있습니까? DB에서 작업의 모든 (또는 아마도 중요한 부분)을 할 수 있다면 환상적입니다! 코드 문제가 사라지거나 훨씬 간단 해집니다!
문제 4 : 당신은 무엇을하고 data
있습니까?
DB에서 모든 것을 할 수 없다고 가정하면이 문제를 바로 잡을 수 있습니다. 데이터를 맵으로 가져오고 ( 정렬 하지 않으려 는 것들에 의해 키가 됨) 삽입 순서대로 반복합니다. 일부 키의 값을 바꾸고 추가하여 맵을 수정합니다 새로운 것?
미안하지만 도대체?
발신자는이 모든 것에 대해 걱정할 필요가 없습니다 . 당신이 만든 시스템은 매우 취약합니다. 약간의 잘못을 바꾸는 데는 하나의 멍청한 실수 (어쩌면 우리 모두가 한 것처럼 스스로 할 수도 있음) 만 있으면되며 모든 것은 카드 한 벌처럼 무너집니다.
더 좋은 아이디어는 다음과 같습니다.
- 당신의 기능이
List
.
- 주문 문제를 처리 할 수있는 몇 가지 방법이 있습니다.
- 빨리 실패를 적용하십시오. 함수가 요구하는 순서대로리스트가 아닌 경우 에러를 던집니다. (참고 : 문제 2의 정렬 색인을 사용하여 정렬 색인을 사용할 수 있습니다.)
- 정렬 된 사본을 직접 작성하십시오 (문제 2의 색인을 사용하여).
- 지도 자체를 순서대로 구축하는 방법을 알아 봅니다.
- 함수에 내부적으로 필요한 맵을 생성하므로 호출자가 신경 쓰지 않아도됩니다.
- 이제 순서대로 표현한 내용을 반복하고 필요한 것을 수행하십시오.
- 지도를 반환하거나 적절한 반환 값으로 변환
가능한 변형은 정렬 된 표현을 구성한 다음 인덱스에 대한 키 맵을 작성하는 것 입니다. 이렇게하면 실수로 복제본을 만들지 않고 정렬 된 사본을 제자리에서 수정할 수 있습니다.
또는 아마도 더 이해가 될 것입니다 : data
매개 변수를 제거 하고 processData
실제로 자체 데이터를 가져 오십시오 . 그런 다음 그것을 가지고 있기 때문에 당신이하고있는 것을 문서화 할 수 매우 데이터를 페치하는 방법에 대한 특정 요구 사항을. 즉, 함수를 자신의 것으로 만드십시오 단지 한 부분이 아닌 전체 프로세스를 . 상호 의존성이 너무 강하여 논리를 더 작은 청크로 분할 할 수 없습니다. (프로세스에서 함수 이름을 변경하십시오.)
어쩌면 이것들은 당신의 상황에 맞지 않을 것입니다. 문제에 대한 자세한 내용이 없으면 모릅니다. 그러나 나는 허약하고 혼란스러운 디자인을들을 때를 알고 있습니다.
개요
나는 여기서 문제는 궁극적으로 악마가 세부 사항에 있다고 생각합니다. 이와 같은 문제가 발생하면 실제로 해결하려는 문제에 대한 데이터 가 부적절하게 표현 되기 때문 입니다. 가장 좋은 해결책은 더 나은 표현을 찾는 것입니다 을 찾은 다음 내 문제는 간단 해지기 쉽지만 간단하지는 않습니다.
그 요점을 얻는 사람을 찾으십시오. 당신의 임무는 문제를 간단하고 간단한 문제로 줄이는 것입니다. 그런 다음 강력하고 직관적 인 코드를 작성할 수 있습니다. 그들과 대화하십시오. 좋은 코드와 좋은 디자인은 모든 바보가 간단하고 간단하기 때문에 생각할 수 있다고 생각합니다. 아마도 당신과 대화 할 수있는 사고 방식을 가진 선임 개발자가있을 것입니다.