1

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

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

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

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

当然,我总是可以匹配文本“描述”属性,但这很糟糕,原因很明显。

有没有很好的方法来处理这样的事情? 这个问题并没有真正为我回答。

4

5 回答 5

5

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

lkpTable
PK Identity
Description
FK LogicEnum NULL

lkpLogic
PK EnumValue
LogicParamColumns

In this case, the logic is provided and not altered by users. New lookups can even be routed to use any existing logical rules - so you can have different settings which behave the same way as existing hardcoded business rules, but display differently.

于 2010-01-08T04:01:23.017 回答
3

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

除非您还要根据客户端输入的值创建新的枚举。如果是这种情况,为什么不将主键迁移到 GUID 并使用带有静态字符串成员的静态类(有点像虚拟 ENUM)。那么你就不必担心唯一性,因为除非你故意这样做,否则很难复制指南。

我们使用 GUID 伪枚举方法,因为我们必须维护同一个数据库的多个副本,并且它们很容易不同步。向导在这方面提供帮助。

于 2010-01-08T02:32:03.353 回答
2

1) 为您的客户端分配一个范围,该范围大于您的应用程序将需要的值的数量,例如 1000000。添加一个触发器以强制只允许高于该范围的新值。

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

于 2010-01-08T02:31:30.030 回答
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');
于 2010-01-08T02:46:17.427 回答
1

老实说,这听起来像是一个关注服务于两种不同需求的问题。

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

于 2010-01-08T02:59:31.660 回答