2012-03-24 2 views
1

같은 줄에 몇 가지 질문이 있지만 정확히 같은 것은 없습니다.php 또는 mysql 데이터의 계산

MySql에서 결과를 가져온 후 (일부 테이블 조인을 통해) PHP에서 기본 계산을 수행하거나 새 행을 삽입하고 검색하는 동안 MySql에 실제로 다른 열을 저장하는 더 나은 것이 있습니다. 예컨대

가 : 제품이 판매 :

Item   Price  Quantity  Discount 
Item 1  55   100   10% 

위는 판매 테이블, 가격 열은 항목 테이블에서 공동입니다. 같은 간단한 작업을 수행하는 더 나은 방법입니다

Item   Price  Quantity  Discount Amount 
Item 1  55   100   10%  4950 

자 : 위의 질문을 바탕으로 하나 우리는 Price X Quantity X 0.10을 수행하거나 우리가 우리 테이블은 다음과 같이 볼 수, 결과를 가져 오기 위해 PHP를 사용할 수 있습니까?

비슷한 질문 : Doing Calculations in MySql vs PHP

+0

[MySQL 대 PHP에서 계산하기] (0120-337-005) –

+0

@DanLee, MySql에서 계산을 수행 중이며, 내 저장 중입니다. 다른 열의 값 – Namit

+0

다른 열을 추가하면 업데이트 할 때 약 2 개의 테이블을 고려해야 만 가입 솔루션을 고수 할 수 있습니다. 이것은 지저분해질 수 있기 때문에 –

답변

2

모든 상황에 대한 포괄 규칙이 없습니다. 웹 사이트의 성능과 효율성에 영향을 미치는 많은 요소가 있습니다. 그래서 '최고의'싱글이 없습니다.

Magento와 같은 것을 보면 두 가지가 모두 동일합니다. 한편으로는 모든 EAV 구조가 추상화되어 있고 n 번째로 정규화 된 데이터 조각이 있습니다. 반면에 성능상의 이유로 플랫 테이블에서 미리 계산 된 값을 집계합니다. 여기에는 할인 금액, 기본 가격, 기본 수량 및 선택된 통화로 표시된 세금 등이 포함됩니다. 이전 상황은 유연성과 견고성 측면에서 가장 좋으며 플랫 테이블은 성능 측면에서 더 좋습니다.

일괄 계산을 처리 할 때 플랫 테이블을 사용하면 모든 것이 이미 완료되었으므로 분명히 빠릅니다. 그러나 커널 팬이 지적했듯이, 설정에 대한 변경은 모든 값의 대량 재 계산을 필요로 할 수 있습니다. 주문 내역과 같은 과거 데이터의 경우 사람들이 지불 한 실제 금액을 다시 계산하기를 원하지 않을 것이지만 최상의 솔루션을 결정할 때이를 수행 할 필요성을 고려해야합니다.

성능이 중요하고 계산을 실행하는 데 비용이 많이 든다면 때때로 값을 일괄 적으로 새로 고쳐야 할 수도 있다는 것을 알게되면 정보를 캐싱할지 여부를 결정할 수 있습니다.

그러나 성능 측면에서 중요하지 않거나 계산이 비싸지 만 자주 실행되지 않는 경우 응용 프로그램의 비즈니스 로직 처리 부분 즉 코드에 실제로 속하는 것처럼 데이터베이스에서 벗어나는 것이 더 깔끔합니다.

"최상의"을 정의하는 방법은 여러 가지가 있으므로 상황에 따라 다릅니다. 속도, 청결 함, 메모리 사용량, 프로세서 요구 사항, 디스크 공간 사용량, 개발 관리자가 정의한 임의의 데이터 구조에 맞게 필요성을 균형있게 조정하는 것만으로도 이러한 요소를 고려해야합니다.

실제 문제가 해결되지 않으면 투기가 실제로 주어질 수 있습니다. 좀 더 복잡한 상황이 있다면, 내 생각을 들여다보고 기꺼이 받아 들여야합니다.

편집 : 평이한 데이터 및 200,000 개가 넘는 제품이 포함 된 Magento 카탈로그 페이지는 페이지 캐싱을 사용하지 않고 약 10-20 초 내에로드됩니다. 플랫 데이터가 비활성화되고 EAV 구조가 사용되면 몇 분이 걸릴 것입니다. 저는 지금 일하고 있지 않기 때문에 프로파일 링 데이터를 편리하게 만들지는 못하지만, 실제 어플리케이션에서 단 하나 최고의 솔루션이 없다는 사실을 입증합니다.

0

나는 테이블에서 미리 계산 된 가격을 유지하는 것입니다. 이렇게하면 할인율이 15 %로 변경되면 매번 행마다 값을 다시 계산할 필요가 없습니다. 우리가 그냥 SELECT 문에 계산을 추가 RDBMS 접근

0

.

샘플 :

SELECT 
    ItemID, 
    Price, 
    Quantity, 
    Discount 
    Price * Quantity * Discount AS Amount 
FROM myTable 

또는 원하는 데이터를 검색하고 열로 계산 된 값을 추가 할 뷰를 사용합니다.

계산 된 값은 요청에 대해서만 유효하며 테이블에 열을 추가 할 필요가 없습니다.

1

을 따라야하기 때문에 나는 우리가 우리가 DB에 같은 계산을 유지하지 않아야 우리의 계산에 의해 모든 것을 관리 할 수있는 상단 테이블 구조를 선호하는 것

2

계산은 SQL 쿼리를 가져 오거나 데이터를 가져온 후에 수행 할 수 있습니다. SQL은 매우 복잡하기 시작했을 때 그것이 지저분한 작업을 찾을 수 있지만 SQL 솔루션은,이 단지 개인적인 취향 뭔가 여러 가지면에서

SELECT *, ((Price * Quantity) - ((Price * Quantity) * (Discount * .01))) AS Amount 
FROM ... 

처럼 될 것입니다.

결코 피할 수없는 것은 정한 금액이 아닌 한 데이터베이스에 총계를 저장하는 것입니다. 총 금액이 저장되고 할인 금액 또는 수량이 변경되는 시점에 총액을 업데이트하는 것을 잊을 가능성이 있습니다. 합계가 필요할 때마다 알려진 변수 (quantity * price - discount)에서 계산하면 합계가 항상 정확해야합니다.