Tôi đang xây dựng khỏi số a previous discussion I had with Jon Skeet.Tại sao tôi không thể tin tưởng GUID do khách hàng tạo ra? Liệu việc xử lý PK như một tổng hợp của client-GUID và một máy chủ-GUID có giải quyết được gì không?
Các ý chính của kịch bản của tôi là như sau:
- ứng dụng Client có khả năng tạo ra 'PlaylistItem' đối tượng mới mà cần phải được tiếp tục tồn tại một cơ sở dữ liệu.
- Trường hợp sử dụng yêu cầu PlaylistItem được tạo theo cách sao cho máy khách không phải chờ phản hồi từ máy chủ trước khi hiển thị PlaylistItem.
- Khách hàng tạo UUID cho PlaylistItem, hiển thị PlaylistItem trong ứng dụng khách và sau đó phát lệnh lưu vào máy chủ.
Tại thời điểm này, tôi hiểu rằng việc sử dụng UUID được tạo bởi khách hàng là PK của đối tượng trong cơ sở dữ liệu của tôi sẽ là một thực tế không tốt. Lý do cho điều này là một người dùng độc hại có thể sửa đổi UUID được tạo ra và ép buộc các xung đột PK trên DB của tôi.
Để giảm thiểu bất kỳ thiệt hại nào phát sinh từ việc bắt buộc PK trên PlaylistItem, tôi đã chọn xác định PK dưới dạng tổng hợp của hai ID - UUID do khách hàng tạo và GUID do máy chủ tạo. GUID do máy chủ tạo là ID danh sách phát của PlaylistItem.
Bây giờ, tôi đã sử dụng giải pháp này một lúc, nhưng tôi không hiểu tại sao/tin rằng giải pháp của tôi tốt hơn là chỉ tin tưởng vào ID khách hàng. Nếu người dùng có thể ép buộc một đối tác PK với các đối tượng PlaylistItem của người dùng khác thì tôi nghĩ tôi nên cho rằng họ cũng có thể cung cấp PlaylistId của người dùng đó. Họ vẫn có thể ép buộc các đồng đội.
Vì vậy ... vâng. Cách thích hợp để làm điều gì đó như thế này? Cho phép máy khách tạo UUID, máy chủ đưa ra một ngón tay cái lên/xuống khi lưu thành công. Nếu phát hiện thấy va chạm, hãy hoàn nguyên các thay đổi của khách hàng và thông báo cho collison phát hiện?