SQL常量值的最佳实践

时间:2012-03-30 22:39:31

标签: c# sql constants

在C#或任何其他类似语言中,如果我们使用幻数,那就不好了。 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')。 这里最好的做法是什么?

4 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

如果您有一个查找表,我希望每个记录都有一个名为“Code”的列,并保持其唯一性。所以我也会一直加入查找表并使用该字符串值而不是使用ID字段进行检查。字符串值可以是有意义的(例如:ELE_PROD_TYPE)和人类可读。

IF (@productTypeCode = 'ELE_PROD_TYPE')

答案 2 :(得分:0)

魔术数字肯定是一个糟糕的反模式。但是,映射到幻数的常量是一种模式。像

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

SQL中的一个好习惯是使用lookup tables

   PRODUCT TABLE
 TYPE       DESCRIPTION
 1          FOOD
 2          ELECTRONIC
 3          HOUSE

然后使用FOREIGN KEY为此表定义您的实体。

实施例

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..........);

在您的代码中,您可以定义常量,如

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

示例查询(请不要提醒我这种模式不安全:))

公共产品[] getElectronicProducts() {     ... // init connection bla bla bla     Command.CommandText = String.Format(“SELECT * FROM PRODUCTS WHERE PRODUCT_TYPE = {0}”,ProductTypes.ELECTRONIC_PRODUCT);

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

... //do the query and return

}

答案 3 :(得分:0)

使用带有值的枚举,这是一个很好的设计。

添加查找表有两个好处:

1:您可以添加参照完整性

2:有人试图猜测这些神奇的数字会找到查找表并清除他的怀疑

应用程序代码中最重要的部分是您使用枚举。你甚至可以use attributes to assign string keys to enum values

所以,让我建议使用一个表,而不是“魔术数字”有一些有些过分的字符串。 (4个字符= 4个字节,就像一个int键 - 1个字符是1个字节,就像一个tinyint)

您可以使用这样的查找表:

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

使用与拥有int键相同的空间。

这使您更容易阅读SQL查询。