Đăng meta vs bảng cơ sở dữ liệu riêng biệt


29

Khi phát triển các plugin yêu cầu lưu trữ dữ liệu, ưu và nhược điểm của việc sử dụng phương pháp này hay phương pháp khác là gì?

Giải thích được đưa ra trong bộ luật không chi tiết:

Tuy nhiên, trước khi tham gia một bảng hoàn toàn mới, hãy xem xét việc lưu trữ dữ liệu của plugin của bạn trong Post Meta của WordPress (còn gọi là Trường tùy chỉnh) có hoạt động không. Post Meta là phương pháp ưa thích; sử dụng nó khi có thể / thực tế.


FYI: MB Custom Table là một plugin có thể lưu trữ dữ liệu meta vào các bảng tùy chỉnh thay vì bảng meta bài đăng của WP.
Anh Trần

Câu trả lời:


30

Chà, nếu tôi đội mũ của một kiddie tập lệnh WP, câu trả lời của tôi sẽ là: sử dụng post_meta, luôn luôn.

Tuy nhiên, tôi tình cờ biết một vài điều về cơ sở dữ liệu, vì vậy câu trả lời của tôi là: không bao giờ, bao giờ, sử dụng EAV (còn gọi là bảng post_meta) để lưu trữ dữ liệu mà bạn có thể cần truy vấn.

Về mặt chỉ mục, về cơ bản không có giá trị sử dụng trong các bảng meta. Vì vậy, nếu bạn đang lưu trữ kiểu dữ liệu XYZ và hy vọng bạn truy vấn tất cả các bài đăng có XYZ có giá trị 'abc', thì ... chúc may mắn. (Xem tất cả các vé liên quan đến người dùng / vai trò / mũ trong WP trac để cho bạn biết ý tưởng về việc nó có thể nhận được như thế nào.)

Về mặt tham gia, bạn nhanh chóng rơi vào giới hạn mà trình tối ưu hóa quyết định sử dụng thuật toán chung thay vì phân tích truy vấn khi có nhiều tiêu chí tham gia.

Như vậy, không, không, không, không. Đừng bao giờ, bao giờ, bao giờ sử dụng một meta. Trừ khi những gì bạn lưu trữ là mỹ phẩm và sẽ không bao giờ là một phần của tiêu chí truy vấn.

Nó phá vỡ ứng dụng của bạn. Nếu bạn đang lưu trữ, giả sử, ngày sinh của một đạo diễn phim, hơn cả vấn đề lớn. Sử dụng một meta tất cả những gì bạn muốn. Nhưng nếu bạn đang lưu trữ, giả sử, ngày phát hành của một bộ phim, bạn sẽ không thể sử dụng một bảng riêng biệt (hoặc thêm các cột vào bảng bài đăng) và thêm một chỉ mục vào cột đó.


1
Có, các plugin mà tôi đang phát triển đang xử lý dữ liệu tùy chỉnh như sự kiện, tin tức, thông cáo báo chí, công việc cung cấp ... Từ bên ngoài "Thế giới WordPress", sử dụng bảng không thực sự là một tùy chọn. Nhưng lời khuyên từ WordPress Codex, hơi khó hiểu. Làm thế nào các khối dữ liệu được tuần tự hóa có thể được ưu tiên cho dữ liệu chuẩn hóa / cấu trúc / lập chỉ mục?
Nassif Bourguig

1
Nếu bạn hỏi nhà phát triển WP trung bình, anh ta có thể sẽ trả lời "sử dụng meta" hoặc "sử dụng phân loại". Và tôi đồng ý, cho đến khi bạn cần truy vấn nó. Nếu vậy, và tôi tin đó là trường hợp của bạn, câu trả lời duy nhất của tôi là, thêm các trường vào bảng bài viết hoặc tạo một bảng riêng hoàn toàn. Khác bạn gặp phải các vấn đề hiệu suất lớn khi truy vấn và, thậm chí quan trọng hơn đối với danh sách các nút, sắp xếp hàng đầu.
Denis de Bernardy

1
Tôi sẽ có thể giải thích thêm về vấn đề này một chút, tôi thấy nó rất nhiều thông tin nhưng sẽ yêu thích một số dữ liệu hơn, có ai đã thực hiện các bài kiểm tra không?, Chính xác thì những hạn chế và hạn chế chính là gì, cảm ơn.
Wyck

6
@Denis - Khá là ủng hộ nhiệt tình chống lại postmeta, eh? Bạn biết rằng bạn sẽ kiên quyết chống lại chính thống và bạn sẽ rơi ra khỏi những ân sủng tốt đẹp của các thầy tu cao cấp của nhà thờ thơ mã nếu bạn kiên trì nói chuyện như vậy, phải không? :-) Nhưng nghiêm túc, bạn không nghĩ rằng bạn nói quá một chút? Nó thực sự phụ thuộc vào việc sẽ có hàng chục ngàn bản ghi meta hay không. Trong nhiều trường hợp đơn giản là không đủ hồ sơ để lo lắng. Một trang web phức tạp tôi đang triển khai có khoảng 10.000 bản ghi meta với một vài bản ghi mới được lên kế hoạch và nó vẫn ổn (fyi, đây không phải là một blog.)
MikeSchinkel

1
@Denis - Cảm ơn các ý kiến. Và đừng hiểu sai ý tôi, có lẽ tôi nghiêng nhiều hơn về quan điểm của bạn nhưng sự kết hợp của 1.) một cuộc tranh luận kéo dài một giờ với Matt tại WordCamp Birmingham về những ưu điểm của các lĩnh vực giống như Pods và 2.) sự đơn giản của meta đã từ chức để tập trung sự chú ý của tôi vào các vấn đề khác mà tôi có khả năng có thể thay đổi. Tại WCB, tôi đã nhận ra rằng chừng nào Matt chịu trách nhiệm thì nó sẽ không thay đổi bởi vì (tôi đoán là vậy) Matt rất say mê với ý tưởng về ít bảng hơn, anh ta sẽ không cho phép mình nhận ra các mặt trái của việc lập chỉ mục trên một byte 768 Chìa khóa. <thở dài>
MikeSchinkel

5

Nếu plugin của bạn sắp có RẤT NHIỀU dữ liệu, thì sử dụng wp_postmetaKHÔNG phải là ý tưởng hay như được trình bày dưới đây:

Lấy WooC Commerce làm ví dụ, trong một cửa hàng có ~ 30.000 sản phẩm, sẽ có trung bình khoảng ~ 40 bài đăng meta (thuộc tính và mọi thứ) trên mỗi sản phẩm, 5 hình ảnh sản phẩm cho mỗi sản phẩm, có nghĩa là sẽ có ~ 4 hình ảnh meta cho mỗi hình ảnh:

30.000 sản phẩm x 40 meta mỗi cái = 1.200.000 hàng trong wp_postmeta

+

30.000 sản phẩm x 5 hình ảnh mỗi x 4 meta hình ảnh cho mỗi = 600.000 hàng trong wp_postmeta

Vì vậy, chỉ với 30.000 sản phẩm, bạn đang tìm kiếm có 1.800.000 hàng wp_postmeta.

Nếu bạn thêm nhiều thuộc tính vào sản phẩm hoặc hình ảnh sản phẩm của bạn, con số này sẽ nhân lên.

Vấn đề với điều đó có hai mặt:

  • Tự tham gia rất tốn kém với MySQL
  • wp_postmetabảng không được lập chỉ mục trừ khi bạn đang sử dụng các phiên bản mysql sau này (tức là không có chỉ mục FULLTEXT cho meta_value)

Để đưa ra một ví dụ từ một trường hợp thực tế:

SELECT meta_value FROM wp_postmeta WHERE meta_key LIKE '_shipping_city'

Điều này chọn thành phố vận chuyển từ tất cả các chi tiết đơn hàng đến với một con số khổng lồ ~ 3 giây trên một máy chủ chuyên dụng cấp nhập cảnh ngay cả khi có 5-10 đơn hàng . Điều này là do truy vấn được chạy trong số một wp_postmetabảng có ~ 3 triệu hàng trong cài đặt trực tiếp.

Ngay cả trang chủ cũng xuất hiện khá chậm, vì chủ đề lấy các yếu tố khác nhau từ wp_postmeta- thanh trượt, một vài chèn đánh giá, một vài meta khác. Trong danh sách sản phẩm nói chung là rất chậm, tìm kiếm cũng chậm tương tự khi liệt kê sản phẩm.

Bạn không thể sửa lỗi này thông qua bất kỳ phương tiện thông thường. Bạn có thể đặt Tìm kiếm đàn hồi trong máy chủ của mình và sử dụng plugin Tìm kiếm đàn hồi trong Wordpress, bạn có thể sử dụng redis / memcached, bạn có thể sử dụng plugin bộ đệm trang tốt, nhưng cuối cùng, vấn đề cơ bản sẽ vẫn còn - lấy bất kỳ lượng dữ liệu nào từ một cồng kềnh wp_postmetabảng sẽ chậm, bất cứ khi nào nó được thực hiện. Trên máy chủ nơi tôi đã thử nghiệm giải pháp tôi đã triển khai bên dưới, tất cả các giải pháp này đã được cài đặt và định cấu hình đúng và tối ưu hóa, và trang web hoạt động ổn định cho người dùng không đăng nhập hoặc truy vấn thường được thực hiện kể từ khi bổ trợ bộ đệm.

Nhưng thời điểm một người dùng đã đăng nhập đã cố gắng thực hiện một việc không thường được thực hiện hoặc các công cụ lưu trữ, bộ đệm ẩn hoặc bất kỳ tiện ích nào khác muốn lấy dữ liệu thực tế từ db để lưu vào bộ nhớ cache hoặc làm bất cứ điều gì khác, mọi thứ trở nên chậm chạp.

Vì vậy, tôi đã thử một cái gì đó khác:

Tôi đã mã hóa một plugin nhỏ để đưa tất cả meta sản phẩm (postmeta cho sản phẩm loại bài đăng ) vào một bảng tùy chỉnh được tạo bởi mã. Plugin này lấy tất cả meta cho mỗi bài đăng và tạo một bảng bằng cách thêm từng meta dưới dạng cột và chèn các giá trị vào mỗi hàng. Tôi đã biến định dạng EAV thành định dạng quan hệ ngang, phẳng. Tôi cũng đã có plugin để xóa postmeta khỏi tất cả các sản phẩm đã di chuyển khỏi wp_postmetabảng.

Trong khi tôi đang ở đó, tôi đã chuyển postmeta đính kèm và tất cả meta của loại bài đăng khác vào các bảng của riêng họ.

Sau đó, tôi nối vào get_(post_type)_metabộ lọc để ghi đè truy xuất siêu dữ liệu để phục vụ chúng từ các bảng tùy chỉnh mới.

Bây giờ cùng một truy vấn từ trước đó, mất ~ 3 giây để tìm nạp wp_postmetamất ~ 0,006 giây. Trang web bây giờ hoạt động như thể nó là một bản cài đặt WP mới.

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

Đương nhiên, làm mọi thứ theo cách Wordpress là tốt hơn. Nó thực sự là chuẩn mực.

Tuy nhiên , cũng có kiến ​​thức rõ ràng rằng bảng EAV rất kém hiệu quả trong việc mở rộng quy mô. Nó vô cùng linh hoạt và cho phép bạn lưu trữ bất kỳ dữ liệu nào, nhưng cái giá bạn phải trả cho điều đó, là hiệu suất. Đó là một sự đánh đổi cơ bản.

Trong bối cảnh đó, thật khó để nói với ai đó đang có ý định có hàng đống dữ liệu và - không cho phép - truy vấn / tìm kiếm trên dữ liệu đó để sử dụng wp_postmetabảng cho chắc chắn. Các hit hiệu suất sẽ là tuyệt vời.

Sử dụng các bảng tùy chỉnh của bạn sẽ cho phép dữ liệu của bạn chồng chất và vẫn đủ nhanh.

Giống như cách Pippin Williams, người tạo ra plugin Easy Digital Download đã đề cập rằng anh ta sẽ sử dụng các bảng tùy chỉnh nếu anh ta chỉ bắt đầu mã hóa plugin của mình, nếu bạn sẽ tạo ra thứ gì đó sẽ được sử dụng trong thời gian dài hoặc chất đống nhiều dữ liệu, Sẽ hiệu quả hơn khi sử dụng các bảng tùy chỉnh của bạn nếu bạn thiết kế chúng tốt.

Bạn phải đảm bảo rằng bất kỳ nhà phát triển plugin / addon nào khác có nghĩa là móc vào plugin của bạn để thao tác dữ liệu của bạn trước và sau khi lấy lại dữ liệu. Nếu bạn làm điều đó, thì bạn khá vững chắc.


1
Công cụ thú vị! Một điều cần làm rõ là bộ lọc "get_ (post_type) _meta" được đề cập thực sự được gọi là "get_ (meta-type) _metadata", trong đó loại meta là bài đăng, bình luận hoặc người dùng. Vì vậy, get_post_meta () sẽ đi qua bộ lọc get_post_metadata, bất kể loại bài đăng. Giá trị trả về của bộ lọc là giá trị meta bạn muốn.
Berend

get_ (meta-type) _metadata -> thực sự nó hoạt động với tất cả các loại bài đăng, và thực sự chức năng cuối cùng được truy cập là get_post_metadata. Tuy nhiên, bộ lọc hoạt động khi bạn sử dụng nó.
đoàn kết 100

2

Nó phụ thuộc vào những gì bạn đang làm. Cách WP là sử dụng các bảng hiện có, vì chúng được thiết kế đủ linh hoạt, tuy nhiên đôi khi bạn sẽ đạt được một lớp dữ liệu mới không thể đặt trong một bảng hiện có, ví dụ: nếu bạn muốn dữ liệu meta danh mục , bạn có thể chọn tạo bảng wp_termsmeta.

Tuy nhiên, thông thường bạn có thể lưu trữ dữ liệu của mình khá thoải mái trong các bảng khác nhau tồn tại và nơi bạn lưu trữ dữ liệu của mình tùy thuộc vào những gì plugin của bạn làm.

  • Đối với cài đặt plugin chung, hãy sử dụng lệnh gọi API get_option () - điều này cũng sẽ được lưu trong bộ nhớ cache.
  • Đối với các cài đặt plugin dành riêng cho một bài đăng riêng lẻ, sau đó sử dụng dữ liệu meta tùy chỉnh cho mỗi bài đăng với get_post_meta () . Điều này thường là rất nhiều cho những gì bạn cần.

Bộ nhớ đệm được triển khai trong WordPress để tăng tốc thời gian phản hồi của bạn.


1

đồng ý với denis 100%. Nhưng có một cách xung quanh nó.

Vấn đề với việc sử dụng meta post cho các giá trị được truy vấn là khi các giá trị là mảng, v.v.

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

Điều này được lưu trữ trong db dưới dạng một chuỗi nối tiếp, nó sẽ trông giống như thế này:

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

Vì vậy, khi bạn muốn truy vấn tất cả các bài đăng array['key2'] = 'val 2'thì wp phải kéo mọi mục meta được gọi là mảng, giải nén nó, sau đó kiểm tra nó, sau đó chuyển sang phần tiếp theo. Điều này chắc chắn sẽ làm sập máy chủ của bạn nếu trang web của bạn thành công và có nhiều bài viết, trang, bài đăng tùy chỉnh, v.v.

Giải pháp là tùy thuộc vào dự án, và bạn sẽ thấy lý do tại sao. Nếu bạn đã lưu trữ dữ liệu dưới dạng var = valthì wp sẽ có thể tìm kiếm mà không cần php để giải nén mọi bài kiểm tra. Để thực hiện điều này trong kịch bản ở trên, bạn sẽ sử dụng một số không gian tên và lưu trữ các khóa meta:

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

sau đó wp tìm kiếm khóa 2 với val 2 sẽ có thể kéo nó đi ngay lập tức. Đây là dự án tùy thuộc. Dự án hiện tại của tôi phụ thuộc vào khoảng 20 loại dữ liệu khác nhau được lưu trữ với mỗi bài đăng tùy chỉnh, vì vậy, ở trên sẽ chỉ tạo một bảng lớn để tìm kiếm, xem như chúng ta đang mong đợi 100 nghìn bài đăng. Vì vậy, trong kịch bản đó, một bảng tùy chỉnh là cách duy nhất.

Hy vọng điều này sẽ giúp ai đó


0

Đối với trang FarmVille của tôi :) Tôi đã làm cả hai nhưng không bao giờ hoàn thành vì tôi đã bán nó:

  1. Tôi đọc xville farmville và đổ dữ liệu vào một bảng tùy chỉnh
  2. Trong WordPress, tôi có các trường tùy chỉnh tự động được tạo cho mọi trường trong bảng đó (và một số bổ sung)
  3. Bây giờ hãy lo lắng về điều gì xảy ra nếu một giá trị thay đổi trong bảng hoặc ở phía bên kia: trường tùy chỉnh vì chúng cần được liên tục đồng bộ hóa

Tôi đã làm điều này bởi vì tôi muốn một mặt người dùng chỉnh sửa trang wordpress bằng cách nhập dữ liệu farmville mới, ví dụ: "một con bò tốn 10 xu" NHƯNG từ phía tích hợp: NẾU thay đổi trong xml cho biết con bò hiện có giá "20 xu" (thông qua plugin chỉnh sửa giao diện người dùng) sẽ được cung cấp dưới dạng tùy chọn sau nó: sao cho XML HOẶC người dùng đã đúng (loại hệ thống wiki).

Vì vậy, đây là một ví dụ khi sử dụng cả hai.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.