지금 vs. 그때: 내가 지금 그것을 어떻게 지을지, 아니면 내가 그 당시에 그것을 어떻게 지을지
질문:
식당 종업원의 힌트를 추적하고 보고하는 프로그램을 설계하다
패턴은 어떻게 해야 하나요?
버전 1:
CREATE TABLE waiters (
id int,
name varchar,
tip_total int
);
이 버전의 응용 프로그램에서는 프롬프트가 수집되면 시스템에 입력됩니다.대기 인원에 대한 업데이트 총수를 포함하는 줄입니다.이 SQL은 다음과 같이 보일 수 있습니다.
SELECT * FROM waiters WHERE id=:id;
# Application logic calculates new values
# Something like: new_amount = result[2] + amount
UPDATE waiters SET tip_total=:new_amount WHERE id=:id;
저녁 끝날 때의 보도 기교는 다음과 같다.SELECT name, tip_total FROM waiters;
그리고 모든 팁이 나눠진 후에 나는 계속 진행할 수 있고, 계수를 0으로 돌려 다음날을 위해 준비할 수 있다.간단해.UPDATE waiters SET tip_total = 0;
그런데 잠깐만요. 종업원이 테이블에 팁을 주는 게 어때요?두 개의 연속적인 select/업데이트 문장은 어떻습니까? 이 두 문장에서, 분할 업데이트량은 응용 프로그램 논리로 관리됩니다.
버전 2
CREATE TABLE waiters (
id int,
name varchar
);
CREATE TABLE tips (
id int,
staff_id int,
currency_code varchar,
amount int,
time datetime,
FOREIGN KEY (staff_id) REFERENCES waiters(id)
);
이 버전의 프로그램에서 알림이 시스템에 추가되면 알림표에 줄을 삽입합니다.예를 들면 다음과 같습니다. INSERT INTO tips VALUES (1, :table, :usd, :now)
보고는 지금 좀 복잡해졌다.대기 중인 직원에게 알림을 보고하기 위해서는 다음과 같은 것이 필요합니다.
SELECT SUM(amount), currency_code, CONVERT( Date, time) as d GROUP BY currency_code where staff_id = :staff_id AND d = :today
이것은 tips를 받아들인 모든 화폐를 보여 주는 표를 제공할 것입니다. 그리고 프로그램 논리에서 달러로 전환해야 합니다.이 두 가지 방법의 차이는 무엇입니까?
물론 이 두 버전 모두 진정한 생산 품질 응용 프로그램과는 거리가 멀지만, 나는 버전 2가 더 좋다고 생각하는 몇 가지 원인을 깊이 있게 연구하고 싶다.
가장 심각한 죄악에서 가장 가벼운 죄악까지
버전 2 에서는 이러한 문제를 처리하는 방법을 설명합니다.
# Bob has $15 in tips
Thread 1: Reads current tip total of $15
Thread 2: Read current tip total of $15
Thread 1: Calculates new values should be $17, and updates the database
Thread 2: Calculates new values should be $16, and updates the database
# Final value: Bob has $16 in tips
읊다, 읊조리다우리는 방금 첫 2달러의 팁을 포기했다.우리는 조심스러운 잠금을 도입함으로써 이 문제를 해결할 수 있다.사무 격리 단계를
REPEATABLE_READ
로 설정하고 SELECT... FOR UPDATE
를 사용하면 목적을 달성할 수 있습니다.이것은 매우 복잡한 문제로 잘못되기 쉽다.우리들은 그들 자신의 표에 힌트를 삽입할 것이다.동시에 표에 줄을 추가하는 것은 우리에게 어떠한 고통도 가져다 주지 않는다.데이터베이스는 이 문제를 해결할 수 있다.즐거움 코드
Reference
이 문제에 관하여(지금 vs. 그때: 내가 지금 그것을 어떻게 지을지, 아니면 내가 그 당시에 그것을 어떻게 지을지), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/nickbenoit14/now-vs-then-how-i-would-build-it-now-vs-how-i-would-have-built-it-way-back-when-540j텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)