Cấu trúc cơ sở dữ liệu quan hệ tốt nhất cho dữ liệu này


8

Tôi đang trong quá trình tạo sơ đồ cơ sở dữ liệu cho kịch bản sau:

  • Có người dùng
  • Người dùng có vai trò (chẳng hạn như "Nhà phát triển" hoặc "CEO")
  • Vai trò có các ứng dụng (chẳng hạn như "Topdesk")
  • Các ứng dụng có quyền (chẳng hạn như "Cập nhật kiến ​​thức")
  • Một vai trò có thể có quyền, nếu vai trò đã có quyền truy cập vào ứng dụng

Giả sử không có môi trường hiệu năng cao (không cần tối ưu hóa tốc độ), cách tốt nhất để thực hiện lược đồ này là gì? Môi trường cơ sở dữ liệu có thể là MySQL, MSSQL ... đó là về thiết kế cơ sở dữ liệu quan hệ.

Bản thân tôi đã đưa ra những điều sau đây:

Sơ đồ ERD

Tất nhiên, phần tôi không chắc chắn nhất là bảng Application_Permissions_Roles. Nó là một bảng liên kết trên đầu bảng liên kết khác. Tôi chưa bao giờ sử dụng hoặc nhìn thấy điều này trước đây. Một cách khác để làm điều đó là thay thế nó bằng một bảng liên kết giữa Vai trò và Quyền, sau đó sử dụng mã hoặc các ràng buộc để đảm bảo các mối quan hệ cần thiết ... nhưng đó dường như không phải là một giải pháp tốt cho tôi. Những điều này nên được thi hành ở cấp cơ sở dữ liệu nếu có thể (và dường như có thể), chứ không phải ở cấp mã.

Thứ hai, là liên kết giữa Quyền. Ứng dụng và Ứng dụng. Tôi có cần thiết không? Tôi sử dụng nó bởi vì có thể không có bất kỳ hàng nào trong Roles_Applecting (chẳng hạn như khi bạn vừa thêm một ứng dụng mới) và sau đó không thể tìm ra quyền nào thuộc về ứng dụng nào. Nó cũng là một điểm tham chiếu duy nhất để tra cứu ứng dụng nào thuộc quyền. Tôi đoán điều này là đúng, nhưng nó cũng tạo ra một vòng tròn trong thiết kế cơ sở dữ liệu. Lỗi MSSQL trên đó khi cố gắng đặt ON_DELETE hoặc ON_UPDATE thành xếp tầng.

Bất kỳ đề xuất, hoặc đây là cách nó phải được thực hiện? Bất kỳ đề xuất nào khác liên quan đến quy ước đặt tên và như vậy cũng được hoan nghênh (có lẽ là nhận xét).

Cảm ơn,
Lục

Chỉnh sửa: Thay đổi tiêu đề, hy vọng làm cho nó rõ ràng hơn. Cái trước là toàn diện hơn, nhưng có lẽ quá phức tạp.


Tôi không chắc chắn tôi đã tập trung suy nghĩ về sự tương tác của vai trò, ứng dụng và quyền. Mỗi vai trò / ứng dụng có một quyền cụ thể độc lập với các ứng dụng khác của vai trò? Ví dụ: CEO / Topdesk có thể chỉ được phép đọc, trong khi CEO / Lịch có thể viết?
mdoyle 18/03/13

Tôi không hiểu ý bạn là "lược đồ cơ sở dữ liệu quan hệ tốt nhất cho dữ liệu này", ý bạn là gì? Giống như Postgres hoặc MySQL hoặc MSSQL hoặc ... vv?
jcolebrand

@jcolebrand Đoán tiêu đề thậm chí còn ít rõ ràng hơn trước ... Có lẽ "cấu trúc cơ sở dữ liệu" là một từ tốt hơn. Bố trí bảng và quan hệ (khóa ngoại, v.v.).
Luc

@mdoyle Quyền luôn nằm trong một ứng dụng (ví dụ: quyền 'thay đổi đồng hồ hệ thống' trong ứng dụng 'windows') và do đó, quyền thuộc về chính xác một ứng dụng. Một vai trò có thể có cả quyền và ứng dụng, hạn chế duy nhất là nếu bạn có bất kỳ quyền nào, bạn cũng phải có quyền truy cập vào ứng dụng mà quyền đó thuộc về. (Rõ ràng nếu bạn không thể sử dụng Topdesk, bạn không thể có quyền 'Cập nhật kiến ​​thức' cho ứng dụng Topdesk.) Điều này có làm cho nó rõ ràng hơn không?
Luc

Tôi không tin đó Roles_Applicationslà một điều có thật. Cho rằng tất cả các quyền là dành riêng cho ứng dụng, có vẻ như có Applications_Permissions(những gì bạn đã gắn nhãn Permissions), sau đó có thể được gán cho các vai trò cụ thể thông qua một bản ghi trong Applications_Permissions_Roles. Roles_Applications, trên thực tế, dường như đang mô tả sự cho phép ứng dụng cơ bản nhất - truy cập đơn giản. Hoặc, nó đang khẳng định rằng một vai trò có một số mức cấp phép cho một ứng dụng, nhưng bạn phải tìm ở nơi khác để xác định vai trò nào.
mdoyle

Câu trả lời:


3

Cách bạn mô hình hóa nó là tốt. Mô hình của bạn đảm bảo rằng các quy tắc kinh doanh được thực thi bởi cơ sở dữ liệu.

Có một vài điều bạn có thể làm thay thế. Một là sẽ loại bỏ khóa thay thế trên Roles_Applications. Là một bảng giao nhau, bạn có thể sử dụng hai khóa ngoại với nhau làm khóa chính tổng hợp. Nếu bạn đã làm điều này, điều đó sẽ lan truyền RoleApplicationxuống Applications_Permissions_Rolesbàn của bạn . Điều này sẽ có lợi thế là cung cấp cho bạn nhiều hơn "một cửa" cho dữ liệu cấp phép ứng dụng của bạn (tức là ít tham gia hơn) mà không ảnh hưởng đến việc bình thường hóa của bạn dưới bất kỳ hình thức nào.

Một cách khác bạn có thể đi là đơn giản hóa một chút và xác định quyền mặc định cho mỗi ứng dụng. Bạn có thể gọi nó là bất cứ điều gì bạn thích, chẳng hạn như "truy cập mặc định" hoặc "truy cập cơ bản" hoặc "người dùng" hoặc bất cứ điều gì có ý nghĩa với bạn. Điều này sẽ cho phép bạn làm phẳng mô hình của mình và về cơ bản thả Roles_Applicationsbảng và tham gia Applications_Permissions_Rolesthẳng vào Roles. Điều này sẽ thay đổi bản chất của truy vấn mà bạn sẽ sử dụng để hỏi "vai trò nào có thể truy cập ứng dụng nào?" nhưng các quy tắc kinh doanh của bạn vẫn sẽ được thực thi bởi lược đồ.


Cám ơn phản hồi của bạn! Tôi chưa nghĩ đến những gợi ý này. Gợi ý thứ hai sẽ bổ sung rất nhiều logic ứng dụng: tất cả các vị trí xử lý quyền sẽ kiểm tra xem một thao tác không được thực hiện theo quyền mặc định (vì điều đó không thể thay đổi hoặc thậm chí có thể được hiển thị); và công cụ xử lý các ứng dụng nên đảm bảo quyền mặc định được tạo hoặc xóa một cách thích hợp. Nó sẽ đơn giản hóa cơ sở dữ liệu, nhưng với chi phí cao hơn có vẻ như. Tuy nhiên, gợi ý đầu tiên là một lựa chọn, tôi nghĩ tôi sẽ thực hiện điều này. Cảm ơn một lần nữa vì đã xem xét :)
Luc

1

Roles_Applicationkhông xuất hiện để đại diện cho một điều thực sự ở đây. Nó là gì, ngoài việc biểu thị rằng một vai trò cụ thể có một số cấp phép cho ứng dụng, mặc dù bạn cần kiểm tra Applications_Permissions_Rolesđể xác định mức đó là gì? Ví dụ, đây là một CEO nhận được quyền truy cập ghi vào ứng dụng Lịch trong mô hình hiện tại của bạn:

Vai trò

ID    Name
--    ----
1     CEO

Các ứng dụng

ID    Name
--    ----
C     Calendar

Quyền

ID    Application_ID  Permission
--    --------------  ----------
10    C               Write

Roles_Applecting

ID    Role_ID    Application_ID
--    -------    --------------
50    1          C

Ứng dụng_Permissions_Roles

Role_Application_ID    Permission_ID
-------------------    -------------
50                     10

Tôi nghĩ rằng loạt các mối quan hệ này có thể được mô hình hóa mà không có Roles_Applications. Nếu chúng tôi xóa điều đó (như Joel Brown gợi ý, nhưng không thay đổi giả định có "quyền mặc định"):

Vai trò

ID    Name
--    ----
1     CEO

Các ứng dụng

ID    Name
--    ----
C     Calendar

Ứng dụng_Permissions (nee Permissions)

ID    Application_ID  Permission
--    --------------  ----------
10    C               Write

Ứng dụng_Permissions_Roles

Role_ID    Application_Permission_ID
-------    -------------
1          10

Bảng cũ Permissionskhông có các quyền đơn giản, như "đọc" và "ghi", sau đó có thể được áp dụng cho các ứng dụng như "Topdesk" và "Lịch": Nó chứa các quyền cụ thể của ứng dụng, như "write in Topdesk" và " viết trong Lịch "và" Thay đổi đồng hồ hệ thống trong Windows ". Để làm cho rõ ràng hơn, tôi đã đặt tên cho bảng Applications_Permissionsnhưng tất nhiên đó không phải là một bước cần thiết.

Cách tiếp cận này có tác dụng làm phẳng mô hình, cũng như đề xuất thứ hai của Joel, nhưng không thêm logic ứng dụng hoặc khái niệm về quyền mặc định. Roles_Applicationskhông mang lại bất cứ điều gì cho bên ngoài một dấu hiệu cho thấy vai trò có một số mức độ truy cập vào ứng dụng. Thông tin đó được truyền tải với sự ngắn gọn hơn bởi sự tồn tại của một bản ghi Applications_Permissions_Rolesvới giá trị phù hợp của Role_ID.


Được rồi, tôi hiểu ý của bạn bây giờ. Vấn đề là người ta không phải lúc nào cũng có quyền trên một ứng dụng. Giống như với Microsoft Word, đơn giản là không có. Trong những trường hợp đó, không biết vai trò nào có thể truy cập ứng dụng nào; bạn phải luôn có ít nhất một quyền từ ứng dụng đó được gán cho một vai trò. Đó là đề xuất "quyền mặc định" từ Joel Brown dành cho. Nhờ đề nghị mặc dù! Đó không phải là một ý tưởng tồi và có ý nghĩa, nhưng tôi đơn giản là không thể áp dụng nó vào tình huống của mình. * Nâng cấp *
Luc

Đối với một cái gì đó như Word, không "thực thi" một sự cho phép? Nhưng tôi thấy quan điểm của bạn nếu vì lý do nào đó thực thi hoặc truy cập ứng dụng không được coi là sự cho phép.
mdoyle
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.