在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')。 这里最好的做法是什么?
答案 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查询。