Như những người khác đã đề xuất, mối quan hệ nhiều-nhiều được biểu diễn trong mô hình vật lý bằng một bảng nối. Tôi sẽ làm công việc chân và minh họa điều đó cho bạn:
CATEGORY_ITEM là bảng nối. Nó có một PK tổng hợp bao gồm các FK được di chuyển từ hai bảng còn lại. Dữ liệu mẫu ...
DANH MỤC:
CATEGORY_ID CATEGORY
----------- --------
1 Apple
2 Orange
MỤC:
ITEM_ID NAME
------- ----
1 Foo
2 Bar
CATEGORY_ITEM:
CATEGORY_ID ITEM_ID
----------- -------
1 1
2 1
1 2
Điều trên có nghĩa là: "Foo là cả Apple và Orange, Bar chỉ là Apple" .
PK đảm bảo bất kỳ tổ hợp danh mục và vật phẩm nào không được tồn tại nhiều hơn một lần. Danh mục được kết nối với mục không phải - nó không thể được kết nối nhiều lần.
Vì bạn chủ yếu muốn tìm kiếm các mục thuộc danh mục nhất định, thứ tự của các trường trong PK là {CATEGORY_ID, ITEM_ID} để chỉ mục cơ bản có thể đáp ứng truy vấn đó. Lời giải thích chính xác tại sao nằm ngoài phạm vi này - nếu bạn quan tâm, tôi nhiệt thành khuyên bạn nên đọc Sử dụng Chỉ mục, Luke ! .
Và vì InnoDB sử dụng tính năng phân cụm , điều này cũng sẽ lưu trữ các mục thuộc cùng một danh mục gần nhau về mặt vật lý, điều này có thể khá có lợi cho I / O của truy vấn ở trên.
(Nếu bạn muốn truy vấn các danh mục của mặt hàng đã cho, bạn cần lật thứ tự các trường trong chỉ mục.)