2012-02-17 43 views
7

Tôi có một bảng nhiều người lưu trữ một bản ghi cho mỗi vai trò được phép mà người dùng có thể có. Nếu người dùng cập nhật vai trò của mình (thêm và loại bỏ) vai trò, tôi nên xử lý điều này như thế nào?Cập nhật mối quan hệ nhiều-nhiều

Tôi có nên xóa tất cả vai trò người dùng trước và sau đó thêm các vai trò đã chọn không? Hoặc làm một số loại phù hợp?

+0

đó là lý do tại sao chúng tôi có thông số, bạn chuyển userID và roleID dưới dạng tham số và sau đó bạn thực hiện: 'DELETE FROM MyTable WHERE userID = @UserID AND roleID = @ RoleID' – JonH

+1

Đây thực sự là câu hỏi hay hơn bề mặt. Nếu bạn có giao diện người dùng cho phép bạn chỉnh sửa nhiều mặt của bảng và cập nhật nó ở chế độ hàng loạt khi người dùng nhấn lưu (thay vì thực hiện từng lần một) người dùng khác có thể sửa đổi bảng bên dưới bạn để bạn thoát 't chắc chắn nếu, ví dụ, một người dùng khác đã thêm vai trò trong khi người dùng hiện tại đang chỉnh sửa trong giao diện người dùng – JohnFx

Trả lời

6

Có rất nhiều cách để da mèo này, một vài kỹ thuật tôi có thể nghĩ:

1. Xóa tất cả vai trò và tái chèn
Đây là một cách tiếp cận thẳng về phía trước. Xóa tất cả vai trò cho người dùng và chỉ chèn lại. Thông thường người dùng chỉ thuộc về một vài vai trò (dưới 10). Ngoài ra, có một cơ hội tốt mà không có các khóa ngoại khác liên kết với bảng nhiều-nhiều này.

2. ca khúc Giữ trong những thay đổi và chỉ áp dụng những thay đổi
Đây là công việc nhiều hơn nhưng hiệu quả hơn, ngay cả khi chỉ một chút trong trường hợp này. Các công cụ như ORMs giúp việc theo dõi và áp dụng các loại thay đổi này dễ dàng.

3. Áp dụng những thay đổi như là người dùng thực hiện thay đổi
Trong trường hợp này tôi cho rằng nó có thể chấp nhận để áp dụng các thay đổi DB là đối tác của người dùng cuối người sử dụng vai trò. Có lẽ nó là một cơ sở dữ liệu địa phương và mỗi giao dịch ngắn ngủi. Nhưng tôi đoán đây là một tình huống khó xảy ra.

Tôi không nghĩ có bất kỳ điều gì sai đối với trường hợp cụ thể này để xóa và chèn lại.

1

Nếu một người loại bỏ vai trò tại sao không vượt qua userIDroleID và xóa một bản ghi đó? Tại sao bạn muốn xóa tất cả roleID cho userID cụ thể và sau đó thêm lại chúng?

Từ nhận xét của tôi ở trên, vượt qua hai params: UserIDRoleID

Sau đó, bạn có thể xóa/trích xuất tuple duy nhất.

+0

Cách thiết lập ui vai trò được đặt qua hộp kiểm nơi bạn có thể chọn hoặc bỏ chọn nhiều – chobo

+0

@chobo - để gửi nhiều thông số , bạn có thể sử dụng 'IN' vv Dù bằng cách nào nếu có quá nhiều vai trò, bạn có thể chỉ cần xóa tất cả và chỉ readd những kiểm tra. – JonH

+0

@JonH: chunky qua trò chuyện, phải không? – micahhoover

Các vấn đề liên quan