php vs node js



처리 상태 딜레마 (1)

이 문제에 대한이 내 접근 방식 :

  1. orders 테이블에 string 유형의 열 status 를 추가합니다.
  2. 수업에서 모든 상태의 상수를 정의하면 쉽게 참조 할 수 있습니다.
  3. 상태 값이 이전에 정의한 허용 된 값에만있는 순서 생성에 대한 유효성 검사 규칙을 만드십시오.

이렇게하면 코드 기반을 편집하여 새 상태를 매우 쉽게 추가 할 수 있으며 검색된 상태 값은 여전히 ​​문자열입니다 (설명적임).

나는 이것이 당신의 질문에 대답하기를 바랍니다.

상태 필드 및 이와 유사한 미리 정의 된 값 집합과 관련하여 반복적 인 문제가 있습니다.

신규, 진행 중, 유료 등의 상태를 갖는 주문 엔티티가있는 주문 시스템의 예를 들어 봅시다.

문제 :

주문 상태가 있어야합니다.

  • 저장된 (데이터베이스에)
  • 처리됨 (백엔드에서)
  • 전달됨 (웹 서비스 API의 프론트 엔드에 전달됨)

다음 세 가지 활동을 유지하는 방법 :

  • 상태의 의미를 보존하십시오.
  • 효율적인 스토리지.

다음은 장단점이있는 구현 예입니다.

1- 상태 표

  • 데이터베이스에는 id, name을 가진 상태 테이블이 있습니다.
  • 주문 테이블은 상태의 ID를 참조합니다.

    CREATE TABLE `status` (
      `id` INT NOT NULL,
      `name` VARCHAR(45) NOT NULL,
      PRIMARY KEY (`id`));
    
    CREATE TABLE IF NOT EXISTS `order` (
      `id` INT NOT NULL AUTOINCREMENT,
      `status_id` INT NOT NULL,
      PRIMARY KEY (`id`),
      INDEX `order_status_idx` (`status` ASC),
      CONSTRAINT `order_status_id`
        FOREIGN KEY (`status_id`)
        REFERENCES `status` (`id`)
        ON DELETE NO ACTION
        ON UPDATE NO ACTION);
  • 백엔드 코드에는이 미리 정의 된 정수에 코드의 의미를 부여하는 enum이 있습니다.

    enum Status {
        PAID = 7;
    };
    
    // While processing as action ...
    order.status = Status::PAID;
  • 웹 서비스 API는 상태 번호를 반환합니다.

    order: { id: 1, status_id: 7 }
  • 프론트 엔드 코드는 이러한 미리 정의 된 정수에 코드에서 의미를 부여하는 유사한 열거 형을가집니다. (백엔드 코드와 같은)

  • 장점 :

    • 데이터베이스가 잘 정의되고 표준화되었습니다.
  • 단점 :
    • 상태 번호와 의미 간의 매핑은 사람의 실수와 특정 상태 번호의 의미 정의에 불일치를 줄 수있는 3 곳에서 이루어집니다.
    • status_id: 7status_id: 7 의 의미를 포함하지 않으므로 구체적인 의미를 전달하지 않으므로 API에서 반환 된 데이터는 설명이 아닙니다 status_id: 7

2- 상태 ENUM

  • 데이터베이스에서 주문 테이블에는 미리 정의 된 상태를 포함하는 ENUM 유형의 상태 열이 포함됩니다.

    CREATE TABLE IF NOT EXISTS `order` (
      `id` INT NOT NULL AUTOINCREMENT,
      `status` ENUM('PAID') NULL,
      PRIMARY KEY (`id`));
  • 백엔드 코드는 미리 정의 된 상태에 대한 코드 아티팩트로서 상수 값을가집니다.

    enum Status {
        PAID = 'PAID'
    };

    또는

    class Status {
    public:
        static const string PAID = PAID;
    };

    다음으로 사용됨

    // While processing as action ...
    order.status = Status::PAID;
  • 웹 서비스 API는 상태 상수를 반환합니다.

    order: { id: 1, status: 'PAID' }
  • 프론트 엔드 코드는 미리 정의 된 상태 상수에 대해 유사한 구문을 갖습니다. (백엔드 코드와 같은)

  • 장점 :

    • 데이터베이스가 잘 정의되고 표준화되었습니다.
    • API에서 리턴 된 데이터는 설명 적이며 필요한 의미를 제공합니다.
    • 사용 된 상태 상수에는 오류의 가능성을 줄이는 의미가 이미 포함되어 있습니다.
  • 단점 :
    • 데이터베이스의 열에 ENUM 유형을 사용하는 것은 한계가 있습니다. 나중에 ALTER 명령을 사용하여 해당 열거 형에 새 상태 상수를 추가하는 것은 order 테이블과 같은 거대한 테이블에 특히 비쌉니다.

3 - 제안 된 해결책 :

  • 데이터베이스에는이 테이블의 기본 키인 type string이있는 key 라는 하나의 필드가있는 상태 테이블이 있습니다.

    CREATE TABLE `status` (
      `key` VARCHAR(45) NOT NULL,
      PRIMARY KEY (`key`));
  • 오더 테이블에는 status 테이블의 key 필드를 참조하는 string 유형의 status 라는 필드가 있습니다.

    CREATE TABLE IF NOT EXISTS `order` (
      `id` INT NOT NULL AUTOINCREMENT,
      `status` VARCHAR(45) NOT NULL,
      PRIMARY KEY (`id`),
      INDEX `order_status_idx` (`status` ASC),
      CONSTRAINT `order_status`
        FOREIGN KEY (`status`)
        REFERENCES `status` (`key`)
        ON DELETE NO ACTION
        ON UPDATE NO ACTION);
  • 백엔드 코드는 미리 정의 된 상태에 대한 코드 아티팩트로서 상수 값을가집니다.

    enum Status {
        PAID = 'PAID'
    };

    또는

    class Status {
    public:
        static const string PAID = PAID;
    };

    다음으로 사용됨

    // While processing as action ...
    order.status = Status::PAID;
  • 웹 서비스 API는 상태 상수를 반환합니다.

    order: { id: 1, status: 'PAID' }
  • 프론트 엔드 코드는 미리 정의 된 상태 상수에 대해 유사한 구문을 갖습니다. (백엔드 코드와 같은)

  • 장점 :

    • 데이터베이스가 잘 정의되고 표준화되었습니다.
    • API에서 리턴 된 데이터는 설명 적이며 필요한 의미를 제공합니다.
    • 사용 된 상태 상수에는 오류의 가능성을 줄이는 의미가 이미 포함되어 있습니다.
    • 새로운 상태 상수를 추가하는 것은 상태 테이블의 INSERT 명령으로 간단합니다.
  • 단점 :
    • ???

나는 이것이 실현 가능한 해결책인지 또는이 되풀이되는 문제에 대한 더 나은 해결책이 있는지 알고 싶습니다.

제안 된 솔루션이 왜 나쁜지와 더 나은 솔루션이 더 좋은 이유를 포함하십시오.

고맙습니다.





web-services