Mô hình hóa trong SQL với 3 bảng có quan hệ

  • 277 lượt xem
  • Bài cuối 29 Tháng Mười Hai 2016
Phong Nam đăng này 29 Tháng Mười Hai 2016

Mình đang gặp problem về vấn đề mô hình hóa dữ liệu ở một bài toán như thế này:   Một user trong một hệ thống web được cấp các permission khác nhau, các permission được cấp cho nhiều user khác nhau. Nếu mô hình hóa dữ liệu dạng quan hệ trong sql thì chúng ta có 2 bảng Userpermission và giữa 2 bảng này có quan hệ "many to many". Trong trường hợp này mình xử lý bằng cách tạo một bảng User_Permisison lưu userIdpermissionId là cặp khóa chính để thể hiện quan hệ giữa 2 bảng.   Tuy nhiên, trong permission có một quyền là Customer và với quyền này user được quyền lấy thông tin của một số khách hàng nhất định trong danh sách khách hàng. Điều này có nghĩa khi admin cấp cho user quyền Customer thì cũng phải chỉ định những khách hàng nào và user có thể lấy thông tin được. Như vậy nó phát sinh ra cái customer list sau khi set permission.   Trong trường hợp này thì nên giải quyết như thế nào nhỉ

Sắp xếp theo: Chuẩn | Mới nhất | Bình chọn
Phong Nam đăng này 29 Tháng Mười Hai 2016

Mình có nghĩ ra 2 hướng giải quyết như sau:

 

S1:

Thêm trường customerID vào bảng user_permisison.

Như vậy để mỗi dòng trong bảng là thể hiện một user có quyền hạn là gì và nếu quyền đó là customer thì nó sẽ có id của thằng customer nào đó thì bảng đó thể hiện như sau (giả sử quyền customer có id là 1):

 

userID - permisisonID - customerID

1 - 1 - 2

1 - 1 - 3

1 - 2 - null

 

Nếu cấu trúc như trên trong trường hợp không có permission là customer thì trường customerID là null. Làm như vậy mình cảm giác dữ liệu bị dữ thừa do các cặp userID - permisisonID bị trùng lặp. Nên mình nghĩ các gộp chúng lại.

 

S2: Cách này mình gộp các dòng lại thì customerID nên là một mảng lưu các id của của các customer được lấy thông tin, vì SQL không có mảng nên mình sẽ lưu nó dạng string. Dạng như sau:

 

userID - permisisonID - customerIDs

1 - 1 - 2, 3

1 - 2 - null

 

Tuy nhiên làm vậy thì rõ ràng nó là cách lưu trữ kiểu NoSQL hơn là dạng các quan hệ như SQL.


 

Có bạn nào có cách giải quyết tốt hơn không?

Kiet Tan Le đăng này 29 Tháng Mười Hai 2016

Thêm 1 bảng nữa để lưu trữ các UserCustomer có thể lấy thông tin. 

Id, UserId và UserIsManaged. Id là khóa tự tăng, UserId là người có quyền Customer, UserIsManged là người mà Customer có thể lấy thông tin.

P/s: theo mình nên để là tên bảng là Roles, Users, User_Roles. ý kiến cá nhân thôi nha

Close