2012-03-30 9 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)と人間が読めるものにすることができます。

+0

明確にするために私の質問が更新されました。 – Icerman

0

マジックナンバーは間違いなく反パターンです。しかし、マジックナンバーにマップされる定数はパターンです。 Like

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 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

。ルックアップテーブルを追加

には2つの利点を提供しています:

1:あなたは、参照整合性に

2を追加することができます:誰かがこれらのマジックナンバーは、ルックアップテーブルを見つけ、彼の疑問をクリアするかを推測しようとして

アプリケーションコードの最も重要な部分は、enumの使用です。あなたもuse attributes to assign string keys to enum valuesすることができます。

「マジックナンバー」の代わりに多少拍子がかかっているテーブルを使用することをおすすめします。場合と同じスペースを使用して

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

あなたは、このようなルックアップテーブルを持つことができる - (ちょうどint型のキーのような4つの文字= 4バイト、1文字だけでtinyint型のように、1バイトです)あなたはintキーを持っていました。

これは、SQLクエリを読みやすくします。

関連する問題