메타 게시 대 별도의 데이터베이스 테이블


29

데이터 스토리지가 필요한 플러그인을 개발할 때 한 가지 방법을 사용하는 장단점이 무엇입니까?

분과에 주어진 설명이 자세히 설명되지 않습니다

그러나 완전히 새로운 테이블로 뛰어 들기 전에 WordPress의 Post Meta (일명 Custom Fields)에 플러그인 데이터를 저장할 수 있는지 고려하십시오. 메타 후가 선호되는 방법입니다. 가능하면 실용적으로 사용하십시오.


참고 : MB 사용자 정의 테이블 은 메타 데이터를 WP의 사후 메타 테이블 대신 사용자 정의 테이블에 저장할 수있는 플러그인입니다.
Anh Tran

답변:


30

글쎄, 내가 WP 스크립트 아동의 모자를 취한다면, 내 대답은 항상 post_meta를 사용하는 것입니다.

그러나 데이터베이스에 대해 한두 가지 사실을 알고 있으므로 제 대답은 결코 EAV (일명 post_meta 테이블)를 사용하여 쿼리해야 할 수도있는 데이터를 저장하지 않는 것입니다.

인덱스 프론트에는 기본적으로 메타 테이블에서 사용할 가치가 없습니다. 따라서 데이터 유형 XYZ를 저장하고 있고 XYZ가있는 모든 게시물에 대해 값이 'abc'... 인 행운을 빕니다. (WP trac의 모든 사용자 / 역할 / 캡 관련 티켓을 참조하여 어떻게 얻을 수 있는지에 대한 아이디어를 얻으십시오.)

조인 프론트에서는 옵티마이 저가 조인 기준이 여러 개인 경우 쿼리를 분석하는 대신 일반 알고리즘을 사용하기로 결정하는 한계에 빠르게 충돌합니다.

따라서, 아니요, 아니요, 아니요. 지금, 지금,하지 마십시오 메타를 사용합니다. 저장하는 것이 외형 적이 지 않고 쿼리 기준의 일부가되지 않는 한.

앱으로 분류됩니다. 예를 들어 영화 감독의 생년월일을 저장하는 경우보다 큽니다. 원하는 모든 메타를 사용하십시오. 그러나 영화의 출시 날짜를 저장하는 경우 별도의 테이블을 사용하지 않거나 게시물 테이블에 열을 추가하지 않고 해당 열에 색인을 추가해야합니다.


1
예, 제가 개발하고있는 플러그인은 이벤트, 뉴스, 보도 자료, 구인과 같은 맞춤형 데이터를 처리하고 있습니다. "WordPress World"외부에서 테이블을 사용하는 것은 실제로 옵션이 아닙니다. 그러나 WordPress Codex의 조언은 약간 혼란 스럽습니다. 정규화 / 구조화 / 인덱싱 된 데이터보다 직렬화 된 데이터 청크를 선호하는 방법은 무엇입니까?
Nassif Bourguig

1
평균 WP 개발자에게 물어 보면 "메타 사용"또는 "분류법 사용"이라고 대답 할 것입니다. 그리고 나는 당신이 그것에 대해 문의해야 할 시점까지 동의합니다. 그렇다면 귀하의 경우라고 생각하는 유일한 대답은 게시물 테이블에 필드를 추가하거나 완전히 별도의 테이블을 만드는 것입니다. 그렇지 않으면 쿼리와 관련하여 더 큰 성능 문제가 있으며 노드 목록의 경우 최상위 정렬이 중요합니다.
Denis de Bernardy

1
Denis는 이것에 대해 좀 더 자세히 설명 할 수있을 것입니다. 매우 유익하지만 더 많은 데이터를 좋아할 것입니다. 테스트를 한 사람이 있습니까? 정확하게 주요 단점과 한계는 무엇입니까? 감사합니다.
Wyck December

6
@Denis-postmeta에 대한 매우 열정적 인 옹호? 당신은 당신이 정통성을 굳게 지키고 있다는 것을 알고 있으며 그러한 대화를 계속한다면 코드시의 교회 대제사들의 은총에서 벗어날 것입니다. :-) 그러나 진지하게 당신이 조금 과장한다고 생각하지 않습니까? 실제로 수만 개의 메타 레코드가 있는지 여부에 달려 있습니다. 대부분의 경우 걱정할만한 기록이 충분하지 않습니다. 내가 배포하는 하나의 복잡한 사이트에는 약 10,000 개의 메타 레코드가 있으며 계획된 새 레코드는 거의 없으며 괜찮습니다 (fyi, 블로그가 아닙니다)
MikeSchinkel

1
@Denis-의견 주셔서 감사합니다. 그리고 나를 잘못 이해하지 마십시오. 아마도 귀하의 관점에 더 많이 기대하지만 1) 포드와 같은 분야의 장점과 2) 메타의 단순성에 대해 WordCamp Birmingham에서 Matt와 1 시간 동안의 논쟁 잠재적으로 변경 될 수있는 다른 문제에주의를 집중하기 위해 사임했습니다. WCB에서 Matt가 담당하고있는 한 Matt가 변경되지 않을 것이라는 사실을 깨닫게되었습니다. 왜냐하면 Matt는 더 적은 테이블에 대한 아이디어에 매료되어 768 바이트에서 색인의 단점을 인식하지 못합니다. 키. <sigh>
MikeSchinkel

5

플러그인에 많은 양의 데이터가있는 경우 다음을 사용하는 wp_postmeta것이 좋지 않습니다.

WooCommerce를 예로 들어 ~ 30,000 개의 제품을 보유한 매장에서는 제품 당 평균 ~ 40 개의 게시물 메타 (속성 및 모든 항목), 제품 당 5 개의 제품 이미지가 표시됩니다. 이는 ~ 4 개의 이미지 메타가 있음을 의미합니다. 각 이미지마다 :

30,000 개 제품 x 40 개 메타 = 1,200,000 개 행 wp_postmeta

+

30,000 개 제품 x 5 개 이미지 x 4 개 이미지 메타 당 = 600,000 개 행 wp_postmeta

따라서 30,000 개의 제품 만 있으면 1,800,000 개의 행을 볼 수 wp_postmeta있습니다.

제품 또는 제품 이미지에 더 많은 속성을 추가하면이 수가 증가합니다.

그 문제는 두 가지입니다.

  • 자체 조인은 MySQL에서 매우 비쌉니다
  • wp_postmeta이후의 mysql 버전을 사용하지 않으면 테이블이 색인화되지 않습니다 (예 :에 대한 FULLTEXT 색인 없음 meta_value).

실제 사례에서 예를 제공하려면 다음을 수행하십시오.

SELECT meta_value FROM wp_postmeta WHERE meta_key LIKE '_shipping_city'

이것은 5 ~ 10 주문이 있더라도 엔트리 레벨 전용 서버에서 ~ 3 초에 모든 주문 세부 사항에서 운송 도시를 선택합니다 . 이는 wp_postmeta라이브 설치에서 약 3 백만 행이 있는 테이블 에서 쿼리가 실행되기 때문 입니다.

테마는 wp_postmeta슬라이더, 리뷰 삽입, 기타 메타 에서 다양한 요소를 가져 오기 때문에 홈페이지조차 매우 느립니다 . 일반적으로 제품 목록이 매우 느리고 제품을 나열 할 때 검색 속도가 느려집니다.

일반적인 방법으로는이 문제를 해결할 수 없습니다. 서버에 Elastic Search를 넣고 Wordpress에서 Elastic Search 플러그인을 사용할 수 있으며, redis / memcached를 사용할 수 있고, 좋은 페이지 캐시 플러그인을 사용할 수 있지만, 결국 근본적인 문제는 남아 있습니다. wp_postmeta완료 될 때마다 테이블이 느려집니다. 아래에서 구현 한 솔루션을 테스트 한 서버 에서이 모든 것이 올바르게 설치 및 구성되었으며 최적화되었으며 캐싱 플러그인이 시작된 후 로그인하지 않은 사용자 또는 일반적으로 수행되는 쿼리에 대해 사이트가 정상적으로 작동했습니다.

그러나 로그인 한 사용자가 일반적으로 수행하지 않은 작업이나 크론, 캐싱 플러그인 또는 기타 유틸리티가 DB에서 실제 데이터를 가져와 캐시하거나 다른 작업을 수행하려고하는 순간 돼지가 느려졌습니다.

그래서 나는 다른 것을 시도했다 :

모든 제품 메타 (post type product for post type product )를 코드로 생성 된 사용자 정의 테이블 로 가져 가기 위해 작은 플러그인을 코딩했습니다 . 이 플러그인은 각 게시물의 모든 메타를 가져 와서 각 메타를 열로 추가하고 각 행에 값을 삽입하여 테이블을 만들었습니다. EAV 형식을 평평한 수평 관계형 형식으로 바꿨습니다. 또한 wp_postmeta테이블 에서 이동 된 모든 제품에서 postmeta를 삭제하는 플러그인이 있습니다.

내가 그 동안 첨부 파일 postmeta 및 다른 모든 게시물 유형의 메타를 자체 테이블 로 옮겼 습니다.

그런 다음 get_(post_type)_meta필터에 연결하여 메타 데이터 검색을 재정 의하여 새 사용자 정의 테이블에서 메타 데이터를 제공합니다.

이제 이전과 동일한 쿼리로 ~ 3 초가 wp_postmeta걸리고 ~ 0.006 초가 걸립니다. 사이트는 이제 새로운 WP 설치 인 것처럼 작동합니다.

....................

당연히 워드 프레스 방식으로 작업하는 것이 좋습니다. 실제로는 표준입니다.

그러나 EAV 테이블이 스케일링에서 매우 비효율적이라는 것도 명백한 지식입니다. 유연성이 뛰어나고 모든 데이터를 저장할 수 있지만 비용은 성능입니다. 기본적인 트레이드 오프입니다.

이러한 맥락에서, 많은 양의 데이터를 원하고 있고 그 데이터를 쿼리 / 검색하여 wp_postmeta테이블을 확실히 사용하려는 사람에게 알리기가 어렵습니다 . 성능이 크게 향상됩니다.

사용자 정의 테이블을 사용하면 데이터가 쌓여도 여전히 빠르게 유지됩니다.

Easy Digital Downloads 플러그인의 제작자 인 Pippin Williams는 플러그인을 코딩하기 시작했을 때 사용자 정의 테이블을 사용한다고 언급했듯이, 오랫동안 사용하거나 많은 데이터를 쌓을 계획이라면, 잘 디자인하면 사용자 정의 테이블을 사용하는 것이 더 효율적입니다.

데이터를 검색하기 전후에 다른 플러그인 / 애드온 개발자가 플러그인에 연결하여 데이터를 조작 할 수있는 수단이 있는지 확인해야합니다. 그렇게하면 꽤 견실합니다.


1
재미있는 것들! 한 가지 명확히해야 할 것은 언급 된 "get_ (post_type) _meta"필터는 실제로 "get_ (meta-type) _metadata"라고하며 여기서 메타 유형은 post, comment 또는 user입니다. 따라서 get_post_meta ()는 게시 유형에 관계없이 get_post_metadata 필터를 통과합니다. 필터의 반환 값은 최종 메타 값이되는 것입니다.
Berend

get_ (meta-type) _metadata-> 실제로 모든 게시물 유형에서 작동하며 실제로 방문하는 최종 기능은 get_post_metadata입니다. 그러나 그럼에도 불구하고 필터를 사용하면 작동합니다.
unity100

2

그것은 당신이하는 일에 달려 있습니다. WP 방법은 기존 테이블이 충분히 유연하게 설계 되었기 때문에 기존 테이블을 사용하는 것이지만 때로는 메타 데이터 카테고리를 원하는 경우 기존 테이블에 배치 할 수없는 새로운 데이터 클래스에 도달 할 수 있습니다. wp_termsmeta 테이블을 작성하도록 선택할 수 있습니다.

그러나 일반적으로 존재하는 다른 테이블에 데이터를 매우 편안하게 저장할 수 있으며 데이터 저장 위치는 플러그인의 기능에 따라 다릅니다.

  • 일반적인 플러그인 설정의 경우 get_option () API 호출을 사용하십시오 .이 또한 캐시됩니다.
  • 개별 게시물에 특정이 설정 플러그인의 경우, 다음과 포스트 당 사용자 정의 메타 데이터를 사용 get_post_meta () . 일반적으로 필요한만큼 충분합니다.

캐싱은 WordPress 내에 구현되어 응답 시간도 단축됩니다.


1

100 % 거부에 동의했습니다. 그러나 그 주위에 방법이 있습니다.

쿼리 할 값에 포스트 메타를 사용할 때의 문제는 값이 배열 등일 때입니다.

array(
'key1' => 'val 1',
'key2' => 'val 2'
);

이것은 직렬화 된 문자열로 db에 저장되며 다음과 같습니다.

{array["key1"]...{}...}

따라서 모든 게시물을 쿼리하려면 array['key2'] = 'val 2'wp가 array라는 모든 메타 항목을 가져 와서 압축을 푼 다음 테스트 한 다음 다음으로 이동해야합니다. 사이트가 성공적이고 게시물, 페이지, 사용자 정의 게시물 등이 많은 경우 서버가 확실하게 중단됩니다.

솔루션은 프로젝트에 따라 다르며 그 이유를 알 수 있습니다. 데이터를 var = val다음 과 같이 저장하면 wp는 모든 단일 테스트의 압축을 풀기 위해 PHP를 사용하지 않고도 검색 할 수 있습니다. 위 시나리오에서이를 수행하려면 일부 네임 스페이스를 사용하고 메타 키를 저장하십시오.

_array_key1 = 'val 1';
_array_key2 = 'val 2';

그러면 wp 2와 키 2를 찾으면 바로 잡아 당길 수 있습니다. 이것은 프로젝트에 따라 다릅니다. 현재 프로젝트는 약 20 개의 서로 다른 dataTypes을 각 사용자 정의 게시물과 함께 저장해야하므로 위의 내용은 검색 할 거대한 테이블을 생성하여 수만 개의 게시물을 어떻게 기대하는지 알 수 있습니다. 따라서이 시나리오에서는 사용자 정의 테이블이 유일한 방법입니다.

이것이 누군가를 돕기를 바랍니다.


0

내 FarmVille 사이트의 경우 :) 두 가지를 모두 수행했지만 판매했기 때문에 완료하지 않았습니다.

  1. farmville xml을 읽고 사용자 정의 테이블에 데이터를 덤프했습니다.
  2. WordPress에서 해당 테이블의 모든 필드에 대해 자동으로 사용자 정의 필드를 만들었습니다.
  3. 이제 테이블이나 다른 쪽에서 값이 변경되면 어떻게 될지 걱정하십시오.

나는 한 편으로 사용자가 새로운 팜빌 데이터를 입력하여 워드 프레스 사이트를 편집하기를 원했기 때문에이 작업을 수행했다. (프론트 엔드 편집 플러그인을 통해) 그 뒤에 옵션으로 제공됩니다. 따라서 XML 또는 사용자가 옳았습니다 (위키 시스템의 일종).

두 가지를 모두 사용할 때의 예입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.