Chúng ta có những lợi thế gì khi tạo một bảng ánh xạ riêng cho hai bảng quan hệ


9

Trong nhiều CMS nguồn mở khác nhau, tôi đã nhận thấy rằng có một bảng riêng để ánh xạ hai bảng quan hệ. Giống như cho các danh mục và sản phẩm, có một product_category_mappingbảng riêng biệt . Bảng này chỉ có một khóa chính và hai khóa ngoại từ các danh mục và bảng sản phẩm.

Câu hỏi của tôi là những lợi ích của thiết kế cơ sở dữ liệu này thay vì chỉ liên kết các bảng trực tiếp bằng cách xác định khóa ngoại trong một trong hai bảng là gì? Có phải chỉ là vấn đề thuận tiện?

Câu trả lời:


7

Một bảng như vậy thường được gọi là bảng liên kết hoặc bảng cầu .

Đó là cách tiêu chuẩn để tạo mối quan hệ nhiều-nhiều. Với khóa ngoại trực tiếp giữa hai bảng, bạn chỉ có thể tạo mối quan hệ một-nhiều (vì khóa chính mà khóa ngoại ở đó cũng là một ràng buộc duy nhất) hoặc mối quan hệ một đối một (nếu bản thân khóa ngoại cũng là một ràng buộc duy nhất).

Tùy thuộc vào triết lý thiết kế DB, cột khóa chính thường bị bỏ qua và khóa chính của bảng cầu được cấu tạo bởi hai cột khóa ngoại (dù sao bạn cũng cần một ràng buộc duy nhất trên các cột này, vậy tại sao không làm cho nó khóa chính?).


ohh k .... Vì vậy, trong ngắn hạn, Nếu tôi cần phải có mối quan hệ nhiều-nhiều, người ta phải theo phương pháp này, phải không ??
Pankaj Upadhyay

1
@PankajUpadhyay: Đúng. Mối quan hệ MM sẽ được thực hiện theo cách này.
NoChance

@PankajUpadhyay: về lý thuyết, bạn có thể sử dụng các phương pháp khác, nhưng chúng lộn xộn và sai, vì vậy tôi khuyên bạn đừng bao giờ đến đó.
tdammers

2
@PankajUpadhyay: Nếu bạn muốn tạo cơ sở dữ liệu Chuẩn hóa, bạn phải sử dụng bảng thứ 3 như được giải thích. Nếu bạn có mối quan hệ 1-M, bạn chắc chắn không muốn có bàn thứ 3. Nếu bạn có MM hữu hạn và hạn chế và không quan tâm đến Bình thường hóa, bạn có thể làm mà không cần bảng thứ 3. Nói chung, hãy bám vào một cơ sở dữ liệu được chuẩn hóa trừ khi bạn đang xây dựng một kho dữ liệu hoặc một trung tâm dữ liệu (trong những trường hợp như vậy, một lược đồ chuẩn hóa là điều gây tranh cãi).
NoChance

@EmmadKareem: ya, tôi đã thấy rằng .... Yêu cầu của tôi là một-nhiều, vì vậy tôi sẽ không tạo bảng .... Cảm ơn người bạn đời
Pankaj Upadhyay

2

Đó là một cách dễ dàng để thực hiện các mối quan hệ nhiều-nhiều .

Hãy xem xét hai bảng này:

category
--------
categoryID [PK]
categoryName

product
-------
productID [PK]
productName

Nếu bạn thêm một categoryIDtrường vào product, mỗi sản phẩm chỉ có thể có một danh mục. Nhưng nếu chúng ta có một cái product_category_mappingnhư thế này:

product_category_mapping
------------------------
mappingID [PK]
productID [FK]
categoryID [FK]

sau đó chúng ta có thể có:

mappingID  productID  categoryID
--------------------------------
1          1          1
2          1          2
3          2          3
4          2          1  

Vì vậy, sản phẩm 1 thuộc loại 1 & 2 và sản phẩm 2 thuộc loại 3 & 1, vì vậy nhiều sản phẩm thuộc nhiều loại và nhiều loại có nhiều sản phẩm.

Như tdammers viết , bảng này thường được gọi là bảng liên kết hoặc bảng cầu và thậm chí tôi đã thấy nó được gọi là bảng HABTM, từ HasAndBelongsToMany, rõ ràng là Ruby on Rails nói cho nhiều người. Và Wikipedia gọi nó là một bảng nối và có thêm một vài tên cho nó.


Đó không chỉ là Rails-speak, hầu như tất cả các khung công tác PHP mà tôi đã sử dụng đều gọi nó là HABTM.
Sevenseacat

@Karpie Một số ví dụ? Tôi biết CakePHP sử dụng tên HABTM, nhưng nó đã bắt đầu như một bản sao Rails.
yannis

Tôi là một fan hâm mộ lớn của người thay thế. Nhưng tôi thích bỏ qua khóa thay thế "mapsID" và đặt PK tổng hợp vào "ProductID" và "categoryID". Trong tâm trí tôi, khóa tổng hợp gồm 2 người thay thế là quyền thay thế. Bạn sẽ không bao giờ thực sự sử dụng "mapsID" thay thế trong bất kỳ tham gia nào.
Lord Tydus

@LordTydus Tôi đã không viết khóa tổng hợp như tdammers đã làm, không có điểm nào để tái chế câu trả lời của anh ấy. Nhưng có những cách sử dụng hợp lệ cho mappingIDkhóa, một kịch bản phổ biến là theo dõi tốt hơn việc nhập / xuất lớn trong đó bảng giao tiếp chứa nhiều khóa ngoại.
yannis

2

Lý do để sử dụng bảng ánh xạ là để loại bỏ trùng lặp. Đi trước và thử một số kỹ thuật lập bản đồ khác. Bạn sẽ không thể ngăn chặn dữ liệu trùng lặp mà không có nó.

Và điều đó mang lại một câu hỏi 2cd. Tại sao phải loại bỏ sự trùng lặp? Vì vậy, bạn chỉ phải chỉnh sửa dữ liệu 1 lần ở 1 nơi. Đôi khi có hình phạt hiệu suất để loại bỏ trùng lặp. Những lần khác, có TĂNG TỐC hiệu suất để loại bỏ trùng lặp. Ví dụ, nhanh hơn để điền vào danh sách thả xuống với các giá trị tra cứu được chuẩn hóa, hơn là chọn các giá trị trùng lặp riêng biệt trong một bảng lớn.

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.