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

Cách chính xác để thiết lập cơ sở dữ liệu MYSQL cho các tìm kiếm thẻ liên quan?

Chỉ cần tách các thực thể dữ liệu của bạn ra bằng cách chúng là gì và ý nghĩa của chúng. Đối với title , các thẻ tags và tệp tags có vẻ như bạn có hai thực thể:

Picture
----------
ID
Title
File

Tag
----------
ID
Name

Đó là, title và tệp tags (trong trường hợp của bạn, tôi đoán bạn đang lưu trữ nó dưới dạng đường dẫn đến tệp trên hệ thống tệp, điều này tốt) là một thực thể và một thẻ tags là thực thể riêng biệt của chính nó. Vì mỗi Picture có thể có nhiều thẻ tags s và từng thẻ tags có thể liên quan đến nhiều Picture s, đó là một mối quan hệ nhiều-nhiều. Vì vậy, người ta thường tạo một bảng không phải thực thể hỗ trợ để liên kết chúng trong cơ sở dữ liệu:

PictureTagRelationship
----------
PictureID
TagID

Với điều này, bạn có thể nhận được một Picture :

SELECT Picture.Title, Picture.File FROM Picture WHERE Picture.ID = ?id

và các thẻ của nó:

SELECT Tag.ID, Tag.Name FROM Tag
INNER JOIN PictureTagRelationship ON Tag.ID = PictureTagRelationship.TagID
WHERE PictureTagRelationship.PictureID = ?id

(Bạn cũng có thể thực hiện điều đó trong một truy vấn theo một vài cách, tôi chỉ chia nó thành hai cho đơn giản. Hai truy vấn không phải là vấn đề lớn, nhưng nếu bạn cần tối ưu hóa chi phí truy cập cơ sở dữ liệu của mình hoặc nếu bạn thực sự muốn nó là một truy vấn duy nhất thì tôi chắc chắn có thể thực hiện được điều gì đó.)

Hoặc bạn có thể lấy tất cả các hình ảnh cho một thẻ cụ thể:

SELECT Picture.ID, Picture.Title, Picture.File FROM Picture
INNER JOIN PictureTagRelationship ON Picture.ID = PictureTagRelationship.PictureID
WHERE PictureTagRelationship.TagID = ?id

Có những điều chỉnh khác có thể được thực hiện cho thiết kế này và nhiều cách khác để xem và báo cáo về dữ liệu. Nhưng trong tất cả những điều này, có một điểm chính:

Không sử dụng danh sách được phân tách bằng dấu phẩy để lưu trữ dữ liệu. Chuẩn hóa mỗi thực thể dữ liệu thành cấu trúc riêng và lưu trữ nó cho phù hợp. Cơ sở dữ liệu quan hệ rất tuyệt vời cho những việc như vậy. Nhưng bất kỳ khi nào bạn lưu trữ các phần tử dữ liệu riêng biệt dưới dạng một chuỗi được phân tách, bạn sẽ mất sự phân tách của các phần tử đó. Điều này làm cho việc báo cáo về dữ liệu đó trở nên khó khăn hơn, khó tương tác hơn với nó, rất nhiều khó cập nhật hơn và ít trực quan hơn đối với bất kỳ ai khác cần hỗ trợ.

Chỉ cần nhớ rằng bất kỳ trường nào trong cơ sở dữ liệu sẽ được lưu trữ một phần thông tin và chỉ một phần thông tin. Nếu bạn phải nhồi nhét nhiều phần thông tin vào một trường duy nhất thì bạn đang sử dụng cơ sở dữ liệu quan hệ không đúng cách.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tôi có thể dự đoán chỉ mục Zend Framework của mình sẽ lớn như thế nào không? (và một số câu hỏi nhanh:s)

  2. API lịch của Google:Chọn / Tạo lịch?

  3. Trên Cập nhật khóa trùng lặp giống như chèn

  4. Tìm số lượng cột EMPTY hoặc NULL trong bảng MySQL

  5. Đặt giá trị mặc định cho cột loại DATE thành ngày hiện tại không có phần thời gian?