Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Cách truy xuất các giá trị từ cấu trúc MySQL 5.7 được chuẩn hóa phù hợp với các tiêu chí nhất định

Bạn đã sử dụng bảng Thực thể-Thuộc tính-Giá trị để ghi lại các thuộc tính của mình.

Đây là điều ngược lại chuẩn hóa.

Đặt tên cho quy tắc chuẩn hóa đã hướng dẫn bạn đặt các thuộc tính khác nhau vào cùng một cột. Bạn không thể, bởi vì đây không phải là một phương pháp chuẩn hóa.

Để hoàn thành truy vấn của bạn với thiết kế EAV hiện tại, bạn cần xoay vòng kết quả để có được thứ gì đó như thể bạn có bảng ban đầu.

SELECT * FROM (
    SELECT 
         a.article_id,
         a.title, 
         MAX(CASE attr_group WHEN 'ref_id' THEN attribute END) AS ref_id,
         MAX(CASE attr_group WHEN 'dial_c_id' THEN attribute END) AS dial_c_id
         -- ...others...
    FROM test.articles_test a
    INNER JOIN attributes attr ON a.article_id = attr.article_id
    GROUP BY a.article_id, a.title) AS pivot
WHERE pivot.ref_id = '127712' 
  AND pivot.dial_c_id = 51 

Mặc dù truy vấn trên có thể tạo ra kết quả bạn muốn, nhưng hiệu suất sẽ rất khủng khiếp. Nó phải tạo một bảng tạm thời cho truy vấn con, chứa tất cả dữ liệu từ cả hai bảng , sau đó áp dụng mệnh đề WHERE đối với bảng tạm thời.

Bạn thực sự tốt hơn với từng thuộc tính trong cột riêng của nó trong bảng ban đầu của mình.

Tôi hiểu rằng bạn đang cố gắng cho phép nhiều thuộc tính trong tương lai. Đây là một vấn đề phổ biến.

Xem câu trả lời của tôi cho Cách thiết kế bảng sản phẩm cho nhiều loại sản phẩm trong đó mỗi sản phẩm có nhiều thông số

Nhưng bạn không nên gọi nó là "chuẩn hóa", bởi vì nó không phải vậy. Nó thậm chí không không chuẩn hóa . Đó là vô chủ .

Bạn không thể chỉ sử dụng từ ngữ để mô tả bất cứ điều gì bạn muốn - đặc biệt là không đối lập với ý nghĩa của từ đó. Tôi không thể để hết hơi ra khỏi lốp xe đạp và nói "Tôi đang bơm hơi".

Bạn đã nhận xét rằng bạn đang cố gắng làm cho cơ sở dữ liệu của mình "có thể mở rộng". Bạn cũng hiểu sai từ "có thể mở rộng" nghĩa là gì. Bằng cách sử dụng EAV, bạn đang tạo một cấu trúc trong đó các truy vấn cần thiết khó viết và không hiệu quả để thực thi và dữ liệu chiếm 10 lần dung lượng. Nó đối lập với khả năng mở rộng.

Ý bạn là bạn đang cố gắng tạo một hệ thống có thể mở rộng . Điều này phức tạp để triển khai trong SQL, nhưng tôi mô tả một số giải pháp trong câu trả lời Stack Overflow khác mà tôi đã liên kết. Bạn cũng có thể thích bản trình bày của tôi Tạo mô hình dữ liệu mở rộng với MySQL .




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Lưu trữ GUID trong MySQL từ C #

  2. MySQL Workbench - Cách đồng bộ hóa Sơ đồ EER

  3. MySQL ADD COLUMN

  4. Không thể cập nhật dữ liệu từ cơ sở dữ liệu MySQL

  5. Giá trị ngày giờ không chính xác cho hàm str_to_date