Có nên thêm id vào bảng trung gian giữa 2 bảng có quan hệ n-n không?

mình có 2 bảng với quan hệ n-n, mình tạo 1 bảng trung gian cho 2 bảng kia thì có nên thêm id vào bảng trung gian ko?

vd:
cho 2 bảng :
users : id(primary key) , name
roles : id(primary key) , name

giờ mình tạo 1 bảng user_role làm bảng trung gian của 2 bảng trên

user_role: user_id (primary key) , role_id (primary key) , name

cặp user_id,role_id sẽ là cặp khóa chính của bảng này theo mình học csdl thì sẽ tạo như vậy

nhưng có người lại bảo làm vậy ko đúng phải tạo bảng thế này

user_role: id(primary key), user_id,role_id , name

các bạn cho mình hỏi cái thiết kế bên dưới có đúng ko ?

Để (user_id, role_id) thì đảm bảo mỗi cặp (user_id, role_id) chỉ có một tên.

1 Like

đúng rồi mình học thì được dạy như vậy, đảm bảo cặp (user_id, role_id) là duy nhất, và đúng theo thiết kế là thuộc tính ko khóa thì phụ thuộc trực tiếp, phụ thuộc hoàn toàn vào khóa chính

còn cái thêm id vào làm khóa chính, còn user_id, role_id làm khóa ngoại, thì nó lại xảy ra chuyện , mỗi khi thêm record phải tự kiểm tra để đảm bảo cặp user_id, role_id là duy nhất

nên mình mới muốn hỏi là thêm id vào như vậy đúng hay là sai, hoặc đúng trong trường hợp nào, sai trong trường hợp nào

Nếu bạn đang học môn cơ sở dữ liệu quan hệ theo các giáo trình ở trường đại học thì bạn làm thêm id vào là không được, việc gì phải đẻ thêm ra một cột để rồi nó phá vỡ cái primary key đang rất quan trọng.

Nhưng trong thực tế lập trình thì như vậy là bình thường. Người lập trình xử lý business logic ở ngôn ngữ lập trình hơn là ở thiết kế cơ sở dữ liệu. Thời nay lập trình viên cũng hay đụng đến NoSQL nên họ cũng không am hiểu sâu về thiết kế SQL DB, họ có khi còn đối xử với SQL DBMS với những câu SQL rất ư… dở ẹc. Do không tự tin với câu SQL viết ra nên họ cần có cột id, và phần mềm CSDL họ đang dùng hỗ trợ Unique Key để họ thiết lập cho (user_id, role_id) mà không cần phải biến nó thành khoá chính/ khóa ngoại gì cả.

2 Likes

Được. Nó goi là surrogate key hay gọi là technical key. Cái kia gọi là business key.


Có nhiều điểm mạnh yếu khi dùng key này. Hiện tại đa phần người ta treat db như nơi lưu trữ thôi. ko đặt biz ở dưới. Thêm id này vào cho dễ xử lý trên app.

4 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?