2009-07-29 21 views
6

Chúng tôi hiện đang xác định một danh sách các hằng số (chủ yếu là những tương ứng với kiểu liệt kê, chúng tôi đã được định nghĩa trong lớp kinh doanh) ở phía trên cùng của một thủ tục lưu trữ như vậy:Các cách xử lý 'Đếm' khác nhau trong SQL Server là gì?

DECLARE @COLOR_RED INT = 1 
DECLARE @COLOR_GREEN INT = 2 
DECLARE @COLOR_BLUE INT = 3 

Nhưng những thường được lặp đi lặp lại trong nhiều thủ tục lưu trữ để có rất nhiều sự trùng lặp.

Một kỹ thuật khác tôi sử dụng nếu thủ tục chỉ cần một hoặc hai hằng số là chuyển chúng vào làm tham số cho quy trình được lưu trữ. (sử dụng cùng một quy ước của trường hợp trên cho các giá trị không đổi). Bằng cách này, tôi chắc chắn rằng các giá trị trong lớp kinh doanh và lớp dữ liệu là nhất quán. Phương pháp này không tốt cho nhiều giá trị.

Các tùy chọn khác của tôi là gì?

Tôi đang sử dụng SQL Server 2008 và C# nếu có sự khác biệt.

Cập nhật Vì tôi đang sử dụng. Net có cách nào mà người dùng định nghĩa (CLR) loại có thể trợ giúp không?

Trả lời

2

Tôi có thể đề nghị hai cách tiếp cận khác nhau:

1) Xác định một bảng liệt kê với một cột tinyint sắc làm khóa chính và giá trị enum như một chỉ số duy nhất; ví dụ.

CREATE TABLE [dbo].[Market](
     [MarketId] [smallint] IDENTITY(1,1) NOT NULL, 
     [MarketName] [varchar](32) COLLATE Latin1_General_CS_AS NOT NULL, 
CONSTRAINT [PK_Market] PRIMARY KEY CLUSTERED 
(
     [MarketId] ASC 
) ON [PRIMARY] 
) ON [PRIMARY] 

Sau đó một trong hai:

  • Có ứng dụng của bạn nạp liệt kê để lập bản đồ giá trị khóa chính khi khởi động (giả sử điều này sẽ không thay đổi).
  • Xác định hàm để dịch các giá trị điều tra thành giá trị khóa chính. Chức năng này sau đó có thể được sử dụng bởi các procs được lưu trữ chèn dữ liệu vào các bảng khác để xác định khóa ngoài cho bảng liệt kê.

2) Theo (1) nhưng xác định mỗi giá trị khóa chính là lũy thừa 2. Điều này cho phép một bảng khác tham chiếu trực tiếp nhiều giá trị liệt kê mà không cần thêm bảng kết hợp. Ví dụ: giả sử bạn xác định Bảng liệt kê màu với các giá trị: {1, 'Red'}, {2, 'Blue'}, {4, 'Green'}. Một bảng khác có thể tham chiếu các giá trị Red và Green bằng cách bao gồm khóa ngoài 5 (tức là bit OR hoặc 1 và 4).

+0

Một khoá ngoại trên bảng liệt kê là tốt, nhưng giá trị được sử dụng trong quy trình được lưu trữ như thế nào? – tpower

+0

@tpower: Không hoàn toàn chắc chắn tôi hiểu câu hỏi của bạn nhưng tôi thường sẽ vượt qua các giá trị chuỗi enum vào sproc và ngay lập tức dịch chúng thành khóa ngoài bằng cách sử dụng hàm tôi đã đề cập. Do đó, ứng dụng chỉ giao dịch với các giá trị enum, mã DB chỉ giao dịch với các giá trị khóa ngoài. – Adamski

+0

Ý của tôi là, nếu thủ tục được lưu trữ chứa một số logic nghiệp vụ như 'IF @MyVariable = @ MY_ENUMERATION_VALUE_2 THEN', nơi chúng ta cần nêu rõ giá trị các khóa ngoại không giúp được ở đây. – tpower

2

Chức năng xác định người dùng vô hướng? Không hoàn hảo, nhưng chức năng ...

CREATE FUNCTION dbo.ufnRGB (
    @Colour varchar(20) 
) 
RETURNS int 
AS 
BEGIN 
    DECLARE @key int 

    IF @Colour = 'BLue' 
     SET @key = 1 
    ELSE IF @Colour = 'Red' 
     SET @key = 2 
    ELSE IF @Colour = 'Green' 
     SET @key = 3 

    RETURN @KEy 
END 
1

tôi không thích ý tưởng về việc xác định là hằng số một cách hiệu quả cho các thủ tục được lưu trữ ở nhiều nơi những gì - điều này có vẻ như một cơn ác mộng bảo trì và có thể dễ dàng dễ bị lỗi (lỗi chính tả vv). Trong thực tế, tôi có thể không thực sự nhìn thấy nhiều trường hợp khi bạn sẽ cần phải làm một điều như vậy?

Tôi chắc chắn sẽ giữ tất cả các định nghĩa liệt kê ở một nơi - trong các lớp C# của bạn. Nếu điều đó có nghĩa là phải chuyển chúng vào các thủ tục của bạn mỗi lần, vậy thì hãy làm. Ít nhất theo cách đó, chúng chỉ được xác định ở một nơi.

Để làm cho việc này dễ dàng hơn, bạn có thể viết một số phương thức trợ giúp để gọi các thủ tục tự động chuyển các tham số enum vào cho bạn. Vì vậy, bạn gọi một phương thức trợ giúp chỉ với tên thủ tục và tham số "biến" và sau đó phương thức trình trợ giúp thêm phần còn lại của các tham số liệt kê cho bạn.

3

Điều này có thể gây tranh cãi: việc lấy của tôi không sử dụng các liệt kê trong T-SQL. T-SQL không thực sự được thiết kế theo cách làm cho enums trở nên hữu ích, theo cách chúng ở các ngôn ngữ khác. Đối với tôi, trong T_SQL, họ chỉ cần thêm nỗ lực và sự phức tạp mà không có lợi ích được thấy ở nơi khác.

+1

Tôi đồng ý, đó là cơ sở dữ liệu. Việc ánh xạ giữa tên và giá trị phải được thực hiện trong bảng. – nocache

1

Cách sử dụng hàm vô hướng làm hằng số. Quy ước đặt tên sẽ làm cho việc sử dụng của họ gần như liệt kê:

CREATE FUNCTION COLOR_RED() 
RETURNS INT 
AS 
BEGIN 
    RETURN 1 
END 

CREATE FUNCTION COLOR_GREEN() 
RETURNS INT 
AS 
BEGIN 
    RETURN 2 
END 

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