2012-09-16 34 views
9

Tôi có một cơ sở dữ liệu được nhiều khách hàng sử dụng. Tôi không thực sự muốn thay thế giá trị khóa thay thế để chảy máu giữa các khách hàng. Tôi muốn đánh số bắt đầu từ 1 và là khách hàng cụ thể.Cách tiếp cận tốt nhất cho các khóa chính đa người thuê nhà

Tôi sẽ sử dụng khóa tổng hợp hai phần của tenant_id cũng như id gia tăng.

Cách tốt nhất để tạo khóa gia tăng cho mỗi người thuê nhà là gì?

Tôi đang sử dụng SQL Server Azure. Tôi lo ngại về việc khóa các bảng, các khóa trùng lặp, v.v. Tôi thường đặt khóa chính thành IDENTITY và tiếp tục.

Cảm ơn

+0

"Tôi không thực sự muốn thay thế giá trị khóa thay thế để chảy máu giữa các khách hàng ..." Tôi tò mò, tại sao bạn không muốn điều này xảy ra? –

+2

Chủ yếu là vì nó sẽ cung cấp cho mọi người một ý tưởng về số lượng hàng mà tôi đang xử lý, trong thế giới của tôi, chúng sẽ hoàn toàn bị chặn khỏi nhau –

+2

Thực tế bạn có thể có cả khóa chính thay thế cho toàn vẹn tham chiếu (ẩn với khách hàng) và hai cột chỉ số duy nhất, ví dụ: (Cust_id, Order_Number) – alexm

Trả lời

2

Bạn có đang lên kế hoạch sử dụng SQL Azure Federations trong tương lai không? Nếu vậy, phiên bản hiện tại của Liên đoàn SQL Azure không hỗ trợ việc sử dụng IDENTITY như một phần của chỉ mục nhóm. Xem phần này What alternatives exist to using guid as clustered index on tables in SQL Azure (Federations) để biết thêm chi tiết.

Nếu bạn chưa xem xét Liên kết, bạn có thể muốn kiểm tra nó vì nó cung cấp một cách thú vị để cả phân đoạn cơ sở dữ liệu và cách ly người thuê trong cơ sở dữ liệu.

Tùy thuộc vào mục tiêu cuối cùng của bạn, sử dụng Liên kết, bạn có thể sử dụng GUID làm chỉ mục nhóm chính trên bảng và cũng sử dụng trường INT IDENTITY gia tăng trên bảng. Trường INT IDENTITY này có thể được hiển thị cho người dùng cuối. Nếu bạn đang liên kết trên TenantID, mỗi "Bảng thuê" có hiệu quả trở thành một silo (vì tôi hiểu nó ít nhất) nên việc sử dụng IDENTITY trên một trường trong bảng đó sẽ là giá trị được tạo tự động ngày càng gia tăng trong một đối tượng thuê .

Khi \ nếu dữ liệu được hợp nhất với nhau (kết hợp dữ liệu từ nhiều người thuê), bạn sẽ kết hợp với trường va chạm trên trường INT IDENTITY này (do đó IDENTITY không được hỗ trợ như khóa chính trong liên kết). không sử dụng trường này như là một định danh duy nhất trong hệ thống lớn, bạn nên ok.

1

Nếu bạn đang tìm cách nhân đôi sự thuận tiện khi có khóa INT duy nhất được gán tự động khi chèn, bạn có thể thêm trình kích hoạt INSTEAD OF INSERT sử dụng MAX của cột hiện tại +1 để xác định giá trị tiếp theo.

Nếu cột có giá trị nhận dạng là khóa đầu tiên trong chỉ mục, truy vấn MAX sẽ là chỉ mục đơn giản tìm kiếm, rất hiệu quả.

Giao dịch sẽ đảm bảo rằng các giá trị duy nhất được chỉ định nhưng cách tiếp cận này sẽ có ngữ nghĩa khóa khác với cột nhận dạng chuẩn. IIRC, SQL Server có thể phân bổ một giá trị nhận dạng khác nhau cho mỗi giao dịch yêu cầu nó song song và nếu một giao dịch được khôi phục, giá trị được phân bổ cho nó sẽ bị loại bỏ. Phương pháp MAX sẽ chỉ cho phép một giao dịch chèn hàng vào bảng tại một thời điểm.

Cách tiếp cận liên quan có thể là để có bảng giá trị khóa chuyên dụng được khóa bằng tên bảng, ID người thuê và giá trị nhận dạng hiện tại. Nó sẽ yêu cầu kích hoạt tương tự INSTEAD OF INSERT và nhiều bản mẫu khác để truy vấn và giữ cho bảng khóa đó được cập nhật. Nó sẽ không cải thiện hoạt động song song mặc dù; khóa sẽ chỉ ở trên một bản ghi của bàn khác.Một trong những khả năng để sửa chữa các nút cổ chai sẽ bao gồm SPID hiện tại trong giá trị của khóa (bây giờ khóa nhận dạng là một sự kết hợp của int tuần tự và bất cứ điều gì SPID đã xảy ra để phân bổ nó và không đơn giản là tuần tự), sử dụng bản sắc chuyên dụng giá trị bảng và chèn hồ sơ có mỗi SPID khi cần thiết; bảng nhận dạng PK sẽ là (tên bảng, đối tượng thuê, SPID) và có một cột không phải khóa với giá trị tuần tự hiện tại. Bằng cách đó, mỗi SPID sẽ có hồ bơi nhận dạng được phân bổ động của riêng mình và sẽ chỉ có bản ghi SPID riêng của mình.

Một nhược điểm khác là duy trì các trình kích hoạt phải được cập nhật bất cứ khi nào bạn thay đổi các cột trong bất kỳ bảng nhận dạng đặc biệt nào.

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