2012-03-10 15 views
6

Xem xét rằng Liên kết SQL Azure không hỗ trợ thuộc tính IDENTITY hoặc SEQUENCEs, cách nào sẽ là cách hiệu quả để tạo số tuần tự khi chèn bản ghi?Cách hiệu quả để tạo số tuần tự trên Liên minh SQL Azure

Ví dụ, đưa ra một bảng với các cột:

CREATE TABLE [dbo].[Orders] (
    [TenantId] [uniqueidentifier] NOT NULL, 
    [OrderId] [uniqueidentifier] NOT NULL, 
    [OrderNumber] [int] NOT NULL 
    CONSTRAINT [PK_Orders] PRIMARY KEY CLUSTERED (
     [TenantId] ASC, 
     [OrderId] ASC 
    ) 
) FEDERATED ON ([FederationKey] = [TenantId]) 

cho mỗi đơn hàng chèn vào cho một người thuê nhà nhất định, OrderId nên được tăng lên. Ví dụ, đối với một OrderId dài hạn sẽ là 1, 2, 3 ... và đối với B OrderId của người thuê nhà cũng sẽ là 1, 2, 3 ... trong một chuỗi độc lập. Lý tưởng nhất là không nên có khoảng trống.

TenantId và OrderId là các thành phần của khóa chính. Giá trị của chúng được thiết lập bởi ứng dụng và chúng không liên quan đến vấn đề tạo chuỗi; chỉ OrderId có số thứ tự với ý nghĩa kinh doanh. Ngoài ra, TenantId là khóa phân phối của liên kết.

This MSDN Blog article mô tả trong tùy chọn 1 cách tiếp cận để có bảng giữ các chuỗi và sử dụng quy trình được lưu trữ trong giao dịch tách biệt để tăng trình tự. Mỗi người thuê nhà sẽ có một bản ghi trên bảng này giữ giá trị được sử dụng cuối cùng của chuỗi.

Đó có phải là phương pháp tối ưu để xem xét khả năng mở rộng, tranh chấp, khóa tài nguyên không? Bất kỳ thủ thuật hữu ích khác, xem xét những hạn chế của Liên minh SQL Azure?

Trả lời

2

Dưới đây là 2 ý tưởng bổ sung.

Một cách tiếp cận sẽ là phải có một quá trình riêng biệt cập nhật trường đó để làm cho điều này không đồng bộ, nếu đó là điều có thể xảy ra cho kịch bản kinh doanh của bạn. Bạn sẽ cần phải có trường OrderNumber chấp nhận giá trị NULL cho phương pháp này. Để biết Thứ tự nào đến trước, để nó nhận được Số thứ tự đúng, tôi cũng sẽ thêm trường ChènedDate. Xử lý Async phức tạp hơn nếu bạn có nhiều vai trò công nhân thực hiện nhiệm vụ này cho dự phòng, trong trường hợp đó bạn sẽ cần phải có từng quá trình gán bản ghi mà nó đang làm việc (vì vậy bạn cũng cần một trường OwnedBy), thêm một kiểm tra đồng thời trong CẬP NHẬT để đảm bảo mỗi quá trình được thực hiện trên hồ sơ riêng của mình, và có nhiệm vụ của hồ sơ hết hạn (vì vậy bạn cũng cần một trường AssignedOn) nếu quá trình treo để nó không để lại trẻ mồ côi. Không thực sự tầm thường ...

Và sau đó bạn có cách tiếp cận người đàn ông nghèo ... mà khi các ngôi sao sắp xếp chính mình cũng đủ tốt có thể là tất cả những gì bạn cần. Nếu bạn sẵn sàng có một cách tiếp cận đồng thời lạc quan, hãy thử sử dụng Số tiếp theo trong khi chèn (chọn MAX OrderNumber đầu tiên cho một TenantId và OrderId), sau đó thực hiện Chèn. Nếu chèn không thành công (vì bạn đã thêm một chỉ mục duy nhất trên TenantId, OrderNumber cho mục đích đó), chỉ cần thêm 1 vào OrderNumber. Vấn đề thực sự ở đây là tần suất thử lại và khả năng của phương pháp này không thành công. Nếu bạn có một quy trình kinh doanh tương đối hợp lý, điều này có thể thực sự không bao giờ thất bại; tuy nhiên, nếu bạn có đơn đặt hàng được thêm liên tục từ nhiều con đường, đây có thể là một cách tiếp cận không được chấp nhận.

+0

Great câu trả lời, ngoài việc lựa chọn tôi trích dẫn trong câu hỏi của tôi (bằng cách sử dụng một thủ tục lưu trữ để cập nhật một bản ghi bằng cách sử dụng một kết nối riêng biệt), thay thế đầu tiên của bạn cung cấp khả năng mở rộng lớn và thông lượng với chi phí của một số phức tạp; lựa chọn thứ hai khá đơn giản và có thể đủ khi quá trình được sắp xếp hợp lý (ví dụ: sử dụng hàng đợi thông báo) hoặc khi tỷ lệ tạo đơn đặt hàng mới cho mỗi đối tượng thuê không quá cao. –

2

không chắc chắn bao nhiêu nỗ lực sẽ được yêu cầu để phù hợp với kịch bản của bạn, nhưng có một cái nhìn tại này là tốt và xem nếu bạn có thể tinh chỉnh nó: SnowMaker – a unique id generator for Azure (or any other cloud hosting environment)

+1

Đó là một nguồn tài nguyên tuyệt vời. Cảm ơn bạn đã đưa nó đến sự chú ý của tôi.Việc xử lý theo lô cục bộ có thể khá hiệu quả và có quy mô tốt, với chi phí có khoảng trống trong trình tự và số thứ tự thời gian, điều này khá phù hợp với ID nội bộ, nhưng làm tăng mối quan tâm (không có căn cứ) khi áp dụng cho các số kiểm soát nghiệp vụ. –

+0

Bạn vẫn khuyên bạn nên sử dụng? –

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