在数据库中维护与客户端软件枚举匹配的ID

时间:2008-11-20 22:41:53

标签: .net sql-server

假设我在sql server 2000数据库中有一个名为TransactionType的表:

CREATE TABLE [dbo].[TransactionType](
    [ID] [int] NOT NULL,
    [Description] [varchar](50) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
 CONSTRAINT [PK_TransactionType] PRIMARY KEY CLUSTERED 
(
    [ID] ASC
) ON [PRIMARY]
) ON [PRIMARY]

然后我有一个事务表,其中包含一个名为TransactionTypeID的列,该列以TransactionType表的ID列为键。

我的.net客户端应用程序负责插入事务记录并指定事务类型。我的第一个想法是定义一个枚举,将枚举转换为整数并将该值传递给数据库。问题是,有人可能会进入数据库并更改TransactionType表中的一个ID,从而使数据库中的ID与客户端应用程序枚举中的ID不同步。

所以,经过漫长的酝酿之后,我的问题是,是否有其他人用来解决这个问题的设计模式/技术?

1 个答案:

答案 0 :(得分:1)

您可能会考虑使用与子表松散绑定(未强制执行)的编码系统。让我们说这是一种颜色,你的孩子表可能如下所示。

ID  | Name
------------
GRN | Green
PURP| Purple
YELL| Yellow
RED | Red

现在您有一个ID,如果您在没有连接的情况下显示,则对人类非常有用,如果您需要更准确/详细的“名称”值,则可以加入或检索它。很明显,当您查看父条目(让我们说它的结果)时,您不需要执行连接。此外,没有充分的理由更改ID

ID | Name   | Color
-----------------
 1 | Banana | YELL
 2 | Apple  | RED
 3 | Cherry | RED

请记住,如果您计划添加许多子类型,则不应使用此系统,但如果您只打算使用十几种类型,则可以是一个很好的快捷方式。如果您计划拥有大量“水果”,这也不是一个好主意,因为CHAR / VARCHAR不是一种有效的方式来处理您的数据。但对于99%的数据库,这种方法都没问题。