与我关于整数而不是小数的问题有些相关;我的供应商以char(1)格式(即Y / N)提供了许多“布尔”字段。其中一些字段合法地不能是布尔值,因为它们可以有多个值,但大多数可以被视为布尔值。在我之前的问题中,建议是做“正确”而不是供应商提供的东西;我是否仍然应用此逻辑并使用这些列的位字段创建我的数据库模式,或将其保留为char(1)并在我的代码中进行转换?
同样在这个问题上,就代码而言,我该如何处理三态字段呢?从逻辑上讲,该字段是一个布尔值(在某种意义上,我只对Y / N值感兴趣,第三个值实际上是“是”或“否”),但这些值可能不仅仅是真/假(例如,有一个可以UpsShippable
,Y
或N
)的G
字段;这个字段有多个状态,那么我怎样才能最好地封装它?像枚举(或静态常量,因为枚举不能与char数据类型一起使用)?在多值情况下,数据更像是类型指示符而不是标志。
总结(我有点啰嗦):1)当处理数据中的char(1)
值时,你会将它们保留为字符或转换为位(或数据库的布尔类型)和为什么,以及2)如何在代码中处理三态char字段,假设您将其作为char(1)
保留在数据模式中?
编辑:为了澄清,这些字段都没有用于“真实”逻辑,它基本上只是一个指标。例如,如果物品不能通过UPS运输(即价值为N / G),那么在面向客户的页面上,它表示物品无法通过UPS运输,而在后端,逻辑将无法生成致电UPS的网络服务以计算运费。其他Y / N字段只是作为项目的额外细节而没有逻辑,尽管它们需要是可更改的(例如,有一个复选框,指示它是否在后端的数据输入表单上回收);我可能会显示图像或过滤它们的项目(例如,您可以搜索所有回收的产品,我会检查以确保它们的回收指标是真的)但没有别的,至少目前还没有。
答案 0 :(得分:3)
我经常处理Oracle,它实际上没有比特类型,因此它从来就不是一个问题。
话虽如此,一个字符代码字段很常见且很好。无论你做什么,但不要给他们一个误导性的名称,如果它有3个状态则表明它是一个布尔类型。这只会让人迷惑。
错误名称:SHIP_FLAG('flag'含糊不清,但许多人将其解释为Y / N或T / F)
错误名称:HAS_BOOKED(再次,暗示布尔值)
错误名称:IS_SENT(同上)
好名字:SHIP_CODE(这可能意味着你想要的任何意思)
此外,一个字符字段允许您稍后扩展含义。位字段不是(真的)。
答案 1 :(得分:1)
我建议在bistate字段中,你总是进行布尔转换。
三态领域是不同的......有很多解决方案,没有一个肯定是“正确的”。您可以为选项集创建表格,并按索引链接...但是除了“正确”之外,您在人类可读性方面失去了很少的收益。
答案 2 :(得分:1)
1 :)取决于char(1)是否只是一个Y / NT / F类型字段然后是我将它转换为一个位,因为它是一个布尔值,我会转换为供应商特定格式at系统的优势(想象一下,你有多个供应商,比如fedEx和UPS,你可能会推广你的后端系统来处理两个发货人,然后插入特定的组件来与你的模型和他们的模型进行通信)。
2 :)如果有多个状态,那么这不再是一个布尔值,我会以一种有意义的格式存储它,将某些选项存储为char字段,或者你可以创建一个查找表,以便UpsShippable你可能有Yes,No或Ground。那么查找表允许您存储关于G含义的更具描述性的信息。如果我在代码中使用Enum,则很大程度上取决于字段和项目的用途。如果你要对该字段运行逻辑,那么我可能会考虑使用一个与查找表很好的枚举,如果你只是存储和传递数据,那么也许我不会。
答案 3 :(得分:0)
我已经决定继续将简单的Y / N字段实现为真正的位字段,但我仍然不确定如何处理多状态字段。
我需要将它们用作标志,以表明是否应该采取其他行动;例如,除非ShippingStatusCode
为Y
,否则该项目被认为是不是UPS可以发运的,并且与可以发运的情况相比,应用了一组不同的逻辑。逻辑可以从不显示某些选项到实际替换已经输入到具有完全不同项目的表单的项目,或者如果查找表明没有等效项目则完全删除它。
一个问题是......一个人去。关于处理多州领域的想法?我必须将它们留作char字段,尽管我认为我会谨慎行事并使用char(3)而不是char(1),以防需求在某些时候发生变化。
答案 4 :(得分:0)
前段时间我遇到了类似的情况。我正在构建一个针对我无法控制的数据库的应用程序,它使用char(1)Y / N字段来表示布尔值。我还使用SubSonic ORM框架来构建我的数据访问层。我所做的是在类上创建另一个属性,用于转换为char(1)字段的表。
public string SomeYNField { ... } // property generated by ORM tool
// property added manually (in a partial class, so
// it doesnt get blown away by the ORM tool)
public bool SomeYNFieldBool
{
get
{
// Anything other than a "Y" is false.
return SomeYNField.Equals("Y", StringComparison.InvariantCultureIgnoreCase);
}
set
{
SomeYNField = value ? "Y" : "N";
}
}
现在您可以使用该布尔字段绑定到期望布尔值的复选框和其他控件。
答案 5 :(得分:0)
您可以创建一个视图,将三态布尔字段置于一个NULLable位字段中。
例如:
CASE UpsShippable WHEN 'Y' THEN 1 WHEN 'N' THEN 0 ELSE NULL END
如果您将此视图创建为索引视图,则从数据中选择时不会产生任何开销。