문제

이것은 실제로 "프로그래밍"(언어나 데이터베이스에만 국한되지 않음)에 관한 질문이 아니라 디자인과 아키텍처에 관한 질문입니다."X를 수행하는 가장 좋은 방법은 무엇입니까?"라는 유형의 질문이기도 합니다.많은 "종교적" 논란이 발생하지 않기를 바랍니다.

과거에 저는 어떤 방식으로든 어떤 형태로든 품목 목록을 유지하는 시스템을 개발했습니다(어떤 품목과 관련이 없음).일부는 트랜잭션을 지원하지 않는 언어/DB를 사용합니다.그런 경우에는 항목을 저장하지 않기로 결정했습니다. 보유 수량 항목 레코드의 필드에 있습니다.대신에 보유 수량 받은 재고의 합계 - 판매된 재고의 합계로 계산됩니다.이로 인해 소프트웨어로 인한 재고 불일치가 거의 발생하지 않았습니다.테이블의 인덱싱이 적절하고 성능이 좋습니다.기록량이 시작되어 성능에 영향을 미칠 경우를 대비하여 아카이빙 프로세스가 있습니다.

몇 년 전 저는 이 회사에서 일하기 시작했고 재고를 추적하는 시스템을 물려받았습니다.그러나 수량은 필드에 저장됩니다.항목을 등록하면 해당 항목의 수량 필드에 수령된 수량이 추가됩니다.상품이 판매되면 수량은 차감됩니다.이로 인해 불일치가 발생했습니다.내 생각에는 이것이 올바른 접근 방식이 아니지만 이전 프로그래머들은 이에 동의합니다.

그러한 시스템을 설계하는 것이 올바른 방법인지에 대한 합의가 있는지 알고 싶습니다.또한 이에 대한 지침을 얻기 위해 인쇄 또는 온라인에서 사용할 수 있는 리소스가 무엇입니까?

감사해요

도움이 되었습니까?

해결책

나는 현재 회사에서 두 가지 접근 방식을 모두 보았고 첫 번째 회사 (주식 거래를 기반으로 한계 계산)에 확실히 기대할 것입니다.

당신이 어딘가에서 총 수량 만 저장하고 있다면, 당신은 그 숫자에 어떻게 도착했는지 전혀 모른다. 거래 기록은 없으며 문제로 끝날 수 있습니다.

내가 쓴 마지막 시스템은 각 트랜잭션을 양수 또는 부정적인 수량의 레코드로 저장하여 재고를 추적합니다. 나는 그것이 매우 잘 작동한다는 것을 알았습니다.

다른 팁

재고 시스템은 단순히 품목을 계산하는 것 이상의 것입니다. 예를 들어, 회계 목적으로 FIFO (First-in-First-Out) 모델을 기반으로 재고의 회계 가치를 알아야 할 수도 있습니다. 간단한 "총 재고 - 총 재고 판매"공식으로 계산할 수 없습니다. 그러나 그들의 모델은 회계 가치를 수정하기 때문에이를 쉽게 계산할 수 있습니다. 나는 이것이 프로그래밍 문제가 아니기 때문에 세부 사항으로 가고 싶지 않지만 맹세한다면, 당신은 그들이 수용해야 할 모든 요구 사항을 완전히 이해하지 못했을 것입니다.

둘 다 상황에 따라 유효합니다. 전자는 다음 조건이 유지 될 때 가장 좋습니다.

  • 합계 할 항목의 수는 비교적 적습니다
  • 고려해야 할 예외적 인 사례는 거의 없거나 전혀 없습니다 (반품, 조정 등)
  • 재고 품목 수량은 자주 필요하지 않습니다

반면에, 많은 품목, 몇 가지 예외적 인 사례 및 자주 액세스가 있으면 품목 수량을 유지하는 것이 더 효율적입니다.

또한 시스템에 불일치가 있다면 주목하십시오 버그가 있습니다 추적하고 제거해야합니다

나는 두 가지 방법으로 시스템을 수행했으며, 버그를 무시하지 않는 한 두 가지 방법 모두 잘 작동 할 수 있습니다!

Arts (소매 기술 표준 협회) 데이터 모델을 살펴보십시오 (http://nrf-arts.org). 각 항목이 레코드와 함께 스톡 링거 테이블을 사용하며 인벤토리 변경 사항은 모두 재고 주민 렌트리스에서 추적됩니다.

기존 시스템과 변경 비용과 위험을 고려하는 것이 중요합니다. 나는 당신과 같은 재고 종류를 저장하는 데이터베이스와 협력하지만, 감사주기와 영수증과 같은 저장 조정이 포함됩니다. 잘 작동하는 것처럼 보이지만 관련된 모든 사람은 잘 훈련되어 있으며 창고 직원이 새로운 절차를 신속하게 배우지는 않습니다.

귀하의 경우 전체 DB 구조를 변경하지 않고 약간 더 추적을 찾고 있다면 추적 테이블 ( '트랜잭션'솔루션에서 비슷한 종류)을 추가 한 다음 재고 수준으로 변경하는 것이 좋습니다. 트랜잭션 레벨을 남기도록 대부분의 변경 사항을 인벤토리 수준으로 업데이트하는 것은 너무 어렵지 않아야합니다. 또한 재고 수준을 트랜잭션 테이블에 백업하기 위해주기적인 작업을 추가하여 거래를 놓치더라도 변경이 발생했을 때 발견하거나 이전 상태로 롤백 할 수 있습니다.

큰 응용 프로그램이 어떻게 보이는지보고 싶다면 Sugarcrm, 데이터를 어떻게 저장하는지 잘 모르겠지만 재고 관리 모듈이 있습니다.

나는 이것이 실제로 필요할 때마다 (상대적으로) 비싼 카운트를 수행하는 것에 대한 일반적인 모범 사례 질문이라고 생각합니다. 총.

거래를 사용할 수 없다면 총 필요할 때마다 라이브 카운트와 함께 갈 것입니다. 트랜잭션을 사용할 수 있으면 재고 업데이트 작업 및 동일한 트랜잭션 내에서 다시 계산 된 총계를 절약하는 것이 안전합니다. 데이터베이스를 치기).

그러나 성능이 실제로 큰 문제가되지 않는다면 (그리고 현대 데이터베이스는 이것에 대해 거의 걱정하지 않을 행을 계산하는 데 충분합니다) 매번 라이브 수를 고수합니다.

나는 첫 번째 길을 선택할 것입니다

손에 든 수량은 수신 된 총 재고 - 총 재고 총 재고로 계산됩니다.

올바른 방법, IMO.

편집하다: 또한 시스템에 대한 주식 손실/손해를 고려하고 싶지만, 당신이 그것을 다루고 있다고 확신합니다.

나는 이전에 이 문제를 해결하는 시스템을 연구한 적이 있습니다.이상적인 솔루션은 두 가지 장점을 모두 얻을 수 있는 미리 계산된 열이라고 생각합니다.총계는 어딘가에 있는 필드이므로 값비싼 조회가 필요하지 않지만 나머지 데이터와 동기화되지 않을 수 없습니다(데이터베이스는 무결성을 유지함).어떤 RDMS가 미리 계산된 열을 지원하는지 기억이 나지 않지만 트랜잭션이 없으면 해당 열도 사용하지 못할 수 있습니다.

잠재적으로 미리 계산된 열을 위조할 수 있습니다(매우 효과적으로...단점은 없습니다) 트리거를 사용합니다.하지만 아마도 거래가 필요할 것입니다.IMHO, 이러한 종류의 제어된 비정규화를 수행할 때 데이터 무결성을 유지하는 것이 트리거를 합법적으로 사용하는 유일한 방법입니다.

Django-Inventory 고정 자산에 더 많은 준비를했지만 아이디어를 줄 수 있습니다.

IE : ItemTemplate (클래스) -> itemsonhand (인스턴스)

Itemsonhand는 더 많은 ItemTemplates에 연결될 수 있습니다. 예제 프린터 및 잉크 카트리지가 필요합니다. 또한 각 itemonhand에 대한 재주문 점을 설정할 수 있습니다.

각 항목은 재고 변환에 연결되어있어 쉽게 감사 할 수 있습니다. 수천 개의 재고 트랜잭션에서 실제 손으로 항목을 계산하지 않으려면 잔액 + 날짜 인 체크 포인트가 사용됩니다. 손 쿼리의 항목을 계산하여 가장 최근의 체크 포인트를 찾아서 항목의 현재 잔액을 찾기 위해 항목을 추가하거나 잠시하기 시작합니다. 새 체크 포인트를 주기적으로 정의하십시오.

두 개의 열을 사용하면 몇 가지 이점을 볼 수 있지만 불일치에 대한 부분을 따르지 않습니다. 두 개의 열(안쪽과 바깥쪽)이 있으면 단일 열(현재)보다 ​​불일치가 덜 발생한다는 것을 암시하는 것 같습니다.왜 그런 겁니까?

하나 또는 두 개의 열이 없으며 "총 재고 수신 - 총 재고 총재"와 함께 의미하는 바는 다음과 같습니다.

Select sum(quantity) as inventory_received from Inventory_entry
Select sum(quantity) as inventory_sold from Sales_items

그 다음에

Qunatity_on_hand = inventory_received - inventory_sold

이것과 초기 설명을 지나치게 단순화한다는 점을 명심하십시오. 재고에는 수량을 추적하는 것이 훨씬 더 많다는 것을 알고 있지만,이 경우 문제는 문제가되고 우리가 고치고 싶은 것입니다. 이 시점에서 변화를 바꾸는 이유는 현재 설계로 인한 문제를 지원하는 데 드는 비용입니다.

또한 "코딩"질문은 아니지만 IMHO가 매우 중요한 주제 인 알고리즘 및 디자인과 관련이 있다고 언급하고 싶었습니다.

지금까지 답변 해 주셔서 감사합니다.

넬슨 마르 몰

우리는 다른 문제를 해결하지만, 그들 중 일부에 대한 우리의 접근 방식은 당신에게 흥미로울 수 있습니다.

우리는 시스템이 "최상의 추측"을 할 수있게하고, 사용자에게 잘못된 모습에 대해 정기적 인 피드백을 제공합니다.

이를 재고에 적용하려면 3 개의 필드가있을 수 있습니다.

inventory_received
inventory_sold
estimated_on_hand

그런 다음 라인을 따라 프로세스 (매일?)를 실행할 수 있습니다.

SELECT * 
FROM   Inventory
WHERE  estimated_on_hand != inventory_received - inventory_sold

물론 이것은이 경고를보고 그것에 대해 무언가를하는 사용자에게 의존합니다.

또한 Inventory_SOLD/수신을 업데이트하거나 다른 필드 "Inventory_AdJustment"를 추가하여 긍정적이거나 부정적 일 수있는 방법을 재설정 할 수있는 기능이있을 수 있습니다.

... 단지 몇 가지 생각. 도움이되기를 바랍니다.

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