>  기사  >  백엔드 개발  >  데이터베이스 비정규화 설계: PHP 프로그래밍에 적용

데이터베이스 비정규화 설계: PHP 프로그래밍에 적용

PHPz
PHPz원래의
2023-06-22 19:09:09912검색

인터넷 기술의 급속한 발전으로 인해 데이터베이스는 데이터 저장 및 관리 센터로서 현대 정보화 시대에 없어서는 안될 부분이 되었습니다. 데이터베이스를 설계할 때 많은 개발자는 데이터베이스 표준화 설계 이론에 최대한 근접하여 데이터 테이블의 구조가 합리적이고 표준화되며 유지 관리 및 쿼리에 편리하기를 바랄 것입니다. 그러나 경우에 따라 비정규화는 중복 데이터와 적절한 데이터 구성을 통해 데이터 저장 및 액세스의 효율성을 최적화하는 데 매우 유용한 기술이기도 합니다. PHP 프로그래밍에서 안티 패러다임 디자인은 성능을 크게 향상시키고, 데이터베이스 시스템 부하를 줄이고, 데이터베이스 확장성을 향상시키며, 개발 주기를 단축할 수 있습니다. 이 기사에서는 안티 패러다임 디자인 원칙, 구현 및 적용 가능한 시나리오 측면에서 PHP를 설명합니다. 프로그래밍에서 역패러다임 디자인을 사용하세요.

1. 정규화된 디자인과 비정규화된 디자인

데이터베이스를 설계할 때 합리적인 정규화된 디자인은 데이터 테이블의 구조를 보다 표준화되고 간결하며 정확하게 만들고 작업을 단순화하며 개발 난이도와 데이터 중복 정도를 줄여 데이터를 향상시키는 것을 목표로 합니다. 전송 및 보안. 데이터베이스 정규화 이론은 주로 1NF(제1 정규형), 2NF(제2 정규형), 3NF(제3 정규형) 등 여러 수준으로 구성되며 속성의 원자성, 엔터티 간의 관계 종속성, 데이터 중복성 측면을 제한합니다. .

비정규화 설계는 특정 데이터 중복성을 높이고 쿼리를 최적화하며 속도를 높여 데이터베이스 성능을 향상시키는 것을 목표로 합니다. 이는 쿼리 또는 저장 시 필드를 여러 테이블로 분할하는 등의 비정규화를 통해 주로 달성됩니다. 업데이트 시 JOIN을 방지하기 위해 여러 테이블에 데이터가 중복됩니다. 그러나 반패러다임 디자인에도 일정한 한계가 있습니다. 대부분의 경우 우수한 패러다임 디자인이 여전히 첫 번째 선택입니다.

2. 비정규화 디자인의 적용 시나리오

비정규화 디자인에서 따라야 할 원칙은 디자인을 평가할 때 개발자의 요구와 사용자 중심의 요구를 고려해야 한다는 것입니다.

  1. 쿼리 요구 사항이 높은 시나리오

잦은 쿼리가 필요한 경우 비정규화 설계를 사용하면 쿼리 효율성을 최적화하고 JOIN 작업 및 사용자 로그인 정보, 주문과 같은 다층 쿼리와 같은 불필요한 쿼리를 줄일 수 있습니다. 캐시를 먼저 로드하고 페이지가 표시될 때 직접 출력할 수 있습니다.

  1. 데이터베이스에 쓰기 또는 액세스량이 많은 경우

비정규화 설계를 채택하면 데이터베이스에 대한 부담을 줄이고, 변경할 필요가 없는 일부 데이터를 여러 테이블로 분할하고, 쓰기 중 잠금을 방지할 수 있습니다. 예를 들어, 제품 가격, 특정 텍스트 설명 등을 먼저 어딘가에 캐시한 다음 실제로 작성될 때 캐시에서 검색할 수 있습니다.

  1. 일부 데이터를 적시에 업데이트/삭제해야 하는 시나리오

비정규화 설계를 사용하면 UPDATE 및 DELETE의 비효율성을 피할 수도 있습니다. 데이터 양이 많은 경우 UPDATE 및 DELETE 작업은 많은 리소스를 소비합니다. 비정규화 설계를 사용하면 일부 데이터를 여러 테이블에 기록하여 분산 처리 및 부분 업데이트/삭제를 수행할 수 있습니다.

3. PHP 프로그래밍에 탈 패러다임 디자인을 적용하는 방법은 무엇입니까?

다음은 비정규화 설계 사용 방법을 보여주는 구체적인 PHP 프로그래밍 예입니다.

  1. 전제: 주문 번호, 제품 ID, 제품 이름, 제품 단가, 제품 수량 및 제품 소계가 주문에 표시되어야 합니다. 세부정보 페이지입니다. 주문 테이블과 제품 테이블이라는 두 개의 테이블이 있습니다. 주문 테이블에는 주문 번호, 제품 ID, 제품 수량 필드가 포함되고, 제품 테이블에는 제품 ID, 제품 이름, 제품 단가 필드가 포함됩니다.
  2. 일반 디자인 계획: 두 개의 테이블을 연결하여 주문 및 해당 제품 정보를 쿼리합니다. 아래와 같이:
SELECT order_no, product_id, product_name, product_price, product_qty, (product_price * product_qty) AS sub_total 
FROM order_tbl
LEFT OUTER JOIN product_tbl
ON order_tbl.product_id = product_tbl.product_id
WHERE order_no = '1001';
  1. 비정규화 설계 계획: 주문 테이블의 제품 이름과 제품 단가의 두 필드를 주문 테이블에 중복하여 쿼리 중 조인 작업을 줄입니다. 아래와 같이:
SELECT order_no, product_id, product_name, product_price, product_qty, (product_price * product_qty) AS sub_total 
FROM order_tbl
WHERE order_no = '1001';
  1. 구현 단계:

(1) order_tbl 및 product_tbl이라는 두 개의 테이블을 만듭니다.

CREATE TABLE `order_tbl` (
  `order_no` varchar(100) NOT NULL,
  `product_id` int(11) NOT NULL,
  `product_qty` int(11) NOT NULL,
  `product_name` varchar(100) DEFAULT NULL,
  `product_price` decimal(10,2) DEFAULT NULL,
  PRIMARY KEY (`order_no`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `product_tbl` (
  `product_id` int(11) NOT NULL,
  `product_name` varchar(100) NOT NULL,
  `product_price` decimal(10,2) NOT NULL,
  PRIMARY KEY (`product_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

(2) 주문 테이블 order_tbl에는 product_name과 product_price라는 두 개의 중복 필드가 있습니다.

ALTER TABLE `order_tbl` ADD COLUMN `product_name` VARCHAR(100) NOT NULL DEFAULT '';
ALTER TABLE `order_tbl` ADD COLUMN `product_price` DECIMAL(10,2) NOT NULL DEFAULT '0.00';

(3) 주문 작성 시 order_tbl과 캐시 테이블 캐시_tbl에 데이터를 작성합니다.

//写入订单表
$sql = "INSERT INTO order_tbl(order_no, product_id, product_qty, product_name, product_price) 
        VALUES ('$order_no', $product_id, $product_qty, '$product_name', $product_price)";

//写入缓存表
$sql_cache = "INSERT INTO cache_tbl(key_name, cache_value) 
              VALUES ('product_info_${product_id}','{"product_name":"${product_name}", "product_price":"${product_price}"}')";

(4) 주문 조회 시 먼저 캐시 테이블인 cash_tbl에서 상품명과 가격을 얻어오고, 캐시에 없으면 상품 테이블 product_tbl에서 상품명과 가격을 조회하여 캐시_tbl에 캐시합니다.

$redis = new Redis(); 
$redis->connect('127.0.0.1', 6379);

$key_name = "product_info_${product_id}";
if ($redis->exists($key_name)) {
  $cache_data = json_decode($redis->get($key_name), true);
  $product_name = $cache_data['product_name'];
  $product_price = $cache_data['product_price'];
} else {
  $sql = "SELECT product_name, product_price FROM product_tbl WHERE product_id=$product_id";
  $result = mysqli_query($conn, $sql);
  $row = mysqli_fetch_array($result);
  $product_name = $row['product_name'];
  $product_price = $row['product_price'];
  $redis->set($key_name, json_encode(['product_name'=>$product_name, 'product_price'=>$product_price]));
}

$sql = "SELECT order_no, product_id, product_name, product_price, product_qty, (product_price * product_qty) AS sub_total 
        FROM order_tbl
        WHERE order_no = '1001'";

이 예에서는 캐싱에 Redis를 사용합니다. 주문 세부정보를 쿼리할 때 먼저 캐시에서 제품 이름과 가격을 가져옵니다. 캐시에 없으면 제품 테이블에서 쿼리하여 기록합니다. 캐시. 이 방법을 통해 JOIN 연산을 방지하고 쿼리 효율성과 성능을 크게 향상시킵니다.

4. 요약

안티 패러다임 디자인에는 장점과 단점이 모두 있으며 합리적인 적용이 핵심입니다. 데이터베이스를 설계할 때에는 실제 상황에 따라 다양한 절충점을 두고, 장단점을 따져보고 설계 방법을 유연하게 사용해야 합니다. PHP 프로그래밍에서 비정규화 설계를 통해 데이터베이스 운영을 최적화하는 것도 매우 유용하고 실용적인 기술입니다. 중복 데이터, 분산 처리, 캐싱 및 인덱싱 전략 및 기타 수단을 추가하여 데이터베이스 성능 및 효율성, 시스템 응답 속도 및 사용자 만족도를 향상시킬 수 있습니다.

위 내용은 데이터베이스 비정규화 설계: PHP 프로그래밍에 적용의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.