2012-03-30 4 views
2

C# 또는 다른 유사한 언어에서 우리가 매직 넘버를 사용하면 나쁜 습관입니다. SQL은 어떻습니까? 이 유형의 SQL을 많이 보았습니다.SQL 상수 값 모범 사례

CREATE PROCEDURE ProcessOrder 
    @productTypeId INT 
    , @productName NVARCHAR(50) 
AS 
BEGIN 

    IF (@productType = 3) -- Electronic product type 
     -- Handle electronic 
    ELSE IF (@productType = 4) -- Other product type  

END  

사용자는 이것을 INT로 변환 된 ENUM으로 호출합니다. ProductType 테이블 (3, 'Electronic')이 있다고 가정합니다. 가장 좋은 방법은 무엇입니까?

답변

2

언제나 기능을 사용할 수 있습니다.

CREATE FUNCTION 
    [dbo].PRODUCT_ELECTRO() 
RETURNS INT 
AS 
BEGIN 
     RETURN 3 
END 


-- This returns the value 3 
SELECT 
    dbo.PRODUCT_ELECTRO() 

IF @MyValue = dbo.PRODUCT_ELECTRO() 
BEGIN 
    PRINT 'The value is tres' 
END 
0

조회 테이블이있는 경우 각 레코드에 대해 "코드"라는 열을 갖고 고유하게 유지하려고합니다. 그래서 항상 조회 테이블에 가입하고 ID 필드로 확인하는 대신 문자열 값을 사용합니다. 그리고 문자열 값은 의미있는 (예 : ELE_PROD_TYPE)과 사람이 읽을 수있는 것이 될 수 있습니다.

IF (@productTypeCode = 'ELE_PROD_TYPE') 
+0

분명히하기 위해 제 질문이 업데이트되었습니다. – Icerman

0

매직 넘버는 틀린 반 패턴입니다. 그러나 매직 넘버에 매핑되는 상수는 하나의 패턴입니다. 마찬가지로

if (productType == 3) //Bad 
if (productType == PRODUCT_ELECTRO) //Good even while PRODUCT_ELECTRO=3 

좋은 연습은 lookup tables입니다!

PRODUCT TABLE 
TYPE  DESCRIPTION 
1   FOOD 
2   ELECTRONIC 
3   HOUSE 

그리고이 테이블에 FOREIGN KEY으로 엔티티를 정의하십시오.

예는

public class ProductTypes { 
    public const int FOOD_PRODUCT = 1; 
    ...... 
} 

예 쿼리와 같은 상수를 정의 할 수 있습니다 코드에서

CREATE TABLE PRODUCT_TYPES (PRODUCT_TYPE_ID NUMBER PRIMARY KEY, PRODUCT_TYPE_DESCRIPTION VARCHAR2); 

CREATE TABLE PRODUCTS (PRODUCT_ID NUMBER PRIMARY KEY, PRODUCT_TYPE NUMBER NOT NULL REFERENCES PRODUCT_TYPES(PRODUCT_TYPE_ID), BLA BLA BLA..........); 

(:)이 패턴은 안전하지 않은 것을 생각 나게하지 마십시오)

공공 제품 [] getElectronicProducts() { ... // 초기화 연결 bla bla bla Command.CommandText = Strin g.Format ("SELECT * FROM PRODUCTS WHERE PRODUCT_TYPE = {0}", ProductTypes.ELECTRONIC_PRODUCT); 그것이 좋은 디자인의 가치와 열거 형을 사용

//Produces "SELECT * FROM PRODUCTS WHERE PRODUCT_TYPE = 3" 

... //do the query and return 

}

+0

예, 조회 표가 있음에 동의합니다. C# 코드를 사용하여 문제를 해결할 수 있습니다. 3을 대체 할 SQL 코드는 어떻게됩니까? 3을 반환하려면 UDF를 사용 하시겠습니까? – Icerman

+0

테이블 구조에서 볼 수 있듯이 PRODUCT_TYPE 열은 내 경우 숫자 인 기본 키를 참조하는 숫자입니다. 따라서 C# 코드는 코드 가독성을 유지하면서 SQL 문에 상수 "3"을 넣습니다. 위의 예 –

0

.

1 : 조회 테이블을 추가

두 가지 이점을 제공합니다 참조 무결성을 추가 할 수 있습니다

2 : 그 매직 넘버는 자신의 의심을 조회 테이블을 찾아 삭제 무슨 생각하려고 사람

응용 프로그램 코드에서 가장 중요한 부분은 열거 형을 사용하는 것입니다. 심지어 use attributes to assign string keys to enum values 수 있습니다.

그래서 "매직 넘버"대신 다소 매끄러운 문자열이있는 테이블을 사용하는 것이 좋습니다.것과 같은 공간을 사용

Key  Value 
'Elec' 'Electronic' 
'Othr' 'Other' 

:

은이 같은 룩업 테이블을 가질 수있다 - (단지 INT 키 추천 문자 = 4 바이트, 1 개 문자 단지 TINYINT처럼, 1 바이트) 당신은 int 키를 가지고 있습니다.

이렇게하면 SQL 쿼리를 더 쉽게 읽을 수 있습니다.