如何管理用户可修改的查找表

时间:2010-01-08 02:25:45

标签: c# sql-server lookup-tables

我们的数据库中有一个表非常类似于标准查找表(ID,描述)。但是,这个特定的不是静态的,客户端希望能够动态添加条目。预先填充的一些条目是“特殊的”,因为会有代码检查它们(各种业务规则)。

通常情况下,我会创建没有自动递增ID的表,因此我可以安全地知道镜像表中条目的枚举始终匹配。然后,只需检查此对象的ID是否与我正在检查的枚举值匹配。

我可以尝试使用相同的方法,ID不会自动递增,而枚举只会覆盖未动态添加的条目。当用户添加新条目时,我们很快就会遇到提出下一个ID的问题。基本上在代码中重新实现数据库的自动增量功能。

如果我切换到使用标识列,则存在与枚举值不同步的整个问题。

当然,我总是可以在文字'描述'属性上匹配,但由于显而易见的原因,这很糟糕。

有没有一种很好的方式来处理这样的事情? This question并没有真正为我解答。

5 个答案:

答案 0 :(得分:5)

除了这里给出的解决方案之外,总是有可能为所有查找外键使用完全无意义的标识,但也有一个列将查找链接到业务逻辑的枚举值:

lkpTable
PK Identity
Description
FK LogicEnum NULL

lkpLogic
PK EnumValue
LogicParamColumns

在这种情况下,逻辑是由用户提供的而不是由用户改变的。甚至可以将新查找路由到使用任何现有逻辑规则 - 因此您可以使用与现有硬编码业务规则相同的不同设置,但显示方式不同。

答案 1 :(得分:3)

为什么不使用两张桌子?一个表包含您编码的ENUM值。另一个处理所有用户可配置的项目。

除非您正在根据客户输入的值创建新的枚举。如果是这种情况,为什么不将主键迁移到GUID并使用静态类和静态字符串成员(类似于虚拟ENUM)。然后你不需要担心唯一性,因为除非你故意这样做,否则guid更难复制。

我们使用GUID psuedo枚举方法,因为我们必须维护同一数据库的多个副本,并且它们很容易失去同步。在这方面,指南有所帮助。

答案 2 :(得分:2)

1)为客户端分配的范围大于应用程序所需的值,例如1000000.添加触发器以强制仅允许高于该范围的新值。

2)使用自动增量并从您的本地数据库副本生成枚举。

答案 3 :(得分:1)

以米奇的回答为基础:

您可以使用较大的值对标识列进行种子处理,当您使用预定标识填充表时,可以设置标识插入。

CREATE TABLE dbo.Table_1
(
    ID int NOT NULL IDENTITY (1000000, 1),
    Label nvarchar(50) NOT NULL
)  ON [PRIMARY]
GO

SET IDENTITY_INSERT dbo.Table_1 ON
GO

INSERT INTO dbo.Table_1(ID, Label) VALUES (1, 'First');
INSERT INTO dbo.Table_1(ID, Label) VALUES (2, 'Second');

答案 4 :(得分:1)

说实话,这就像是一个关注两个不同要求的问题。

我会将它分成两个表,比如ApplicationLookups和CustomLookups,然后在代码中以及从DB角度对它们进行不同的处理是直观的。