我们的数据库中有一个表非常类似于标准查找表(ID,描述)。但是,这个特定的不是静态的,客户端希望能够动态添加条目。预先填充的一些条目是“特殊的”,因为会有代码检查它们(各种业务规则)。
通常情况下,我会创建没有自动递增ID的表,因此我可以安全地知道镜像表中条目的枚举始终匹配。然后,只需检查此对象的ID是否与我正在检查的枚举值匹配。
我可以尝试使用相同的方法,ID不会自动递增,而枚举只会覆盖未动态添加的条目。当用户添加新条目时,我们很快就会遇到提出下一个ID的问题。基本上在代码中重新实现数据库的自动增量功能。
如果我切换到使用标识列,则存在与枚举值不同步的整个问题。
当然,我总是可以在文字'描述'属性上匹配,但由于显而易见的原因,这很糟糕。
有没有一种很好的方式来处理这样的事情? This question并没有真正为我解答。
答案 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角度对它们进行不同的处理是直观的。