Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何管理用户可修改的查找表_C#_Sql Server_Lookup Tables - Fatal编程技术网

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

C# 如何管理用户可修改的查找表,c#,sql-server,lookup-tables,C#,Sql Server,Lookup Tables,在我们的数据库中有一个表,它的行为非常类似于标准的查找表ID,Description。但是,这个特定的不是静态的,客户机希望能够动态添加条目。一些预先填充的条目是特殊的,因为将有代码检查它们和各种业务规则 通常,我会在不使用自动递增ID的情况下创建表,这样我就可以安全地知道镜像表中条目的枚举总是匹配的。然后就是检查这个对象的ID是否与我要检查的枚举值匹配 我可以尝试同样的方法,使用不自动递增的ID和只覆盖未动态添加的条目的枚举。当用户添加新条目时,我们很快就会遇到下一个ID的问题。基本上是在代码

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

通常,我会在不使用自动递增ID的情况下创建表,这样我就可以安全地知道镜像表中条目的枚举总是匹配的。然后就是检查这个对象的ID是否与我要检查的枚举值匹配

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

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

当然,我总是可以匹配文本的“Description”属性,但这显然是不好的


有没有一个好办法来处理这样的事情?并不能真正回答我的问题。

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


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

1为客户端指定一个范围,该范围大于应用程序所需的值数,例如1000000。添加一个触发器以强制仅允许新值超过该范围


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

为什么不使用两个表?一个表保存您为其编码的枚举值。另一个处理所有用户可配置的项目

除非是这样,否则您也将基于客户端输入的值创建新的枚举。如果是这样的话,为什么不将主键迁移到GUID,并使用具有静态字符串成员的静态类,有点像虚拟枚举。这样,您就不必担心唯一性,因为除非您有意这样做,否则guid很难复制


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

为什么不使用两个表呢?一个表保存您为其编码的枚举值。另一个处理所有用户可配置的项目

除非是这样,否则您也将基于客户端输入的值创建新的枚举。如果是这样的话,为什么不将主键迁移到GUID,并使用具有静态字符串成员的静态类,有点像虚拟枚举。这样,您就不必担心唯一性,因为除非您有意这样做,否则guid很难复制


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

基于米奇的答案:

您可以使用大值为identity列设置种子,并且在使用预定标识填充表时,可以将identity insert设置为on

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');

基于米奇的回答:

您可以使用大值为identity列设置种子,并且在使用预定标识填充表时,可以将identity insert设置为on

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');

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


我会将它分为两个表,类似于ApplicationLookups和CustomLookups,然后从代码和数据库的角度对它们进行不同的处理将是直观的。

老实说,这闻起来像是一个问题服务于两个不同的需求


我会将其分为两个表,比如ApplicationLookups和CustomLookups,然后从代码和数据库的角度对它们进行不同的处理,这将是很直观的。

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

lkpTable
PK Identity
Description
FK LogicEnum NULL

lkpLogic
PK EnumValue
LogicParamColumns

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

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

lkpTable
PK Identity
Description
FK LogicEnum NULL

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

当用户向表中添加记录时,您将如何处理枚举?什么都不做。这是缺点之一。枚举不会反映新的值,只反映它们在部署时提出的值。显然,如果一个新的描述需要特殊的代码,则需要重新部署。是什么明显的原因导致描述匹配不好?如果这只是更改描述的性质,那么您仍然可以为内置项使用文本代码,这必须在应用程序中硬编码,并且存在于数据库中。它们是相当长的格式描述,有可能发生变化。这不是世界末日,只是另一个缺点。当用户向表中添加记录时,您将如何处理枚举?什么都没有。这是缺点之一。枚举不会反映新的值,只反映它们在部署时提出的值。显然,如果一个新的描述需要特殊的代码,则需要重新部署。是什么明显的原因导致描述匹配不好?如果这只是更改描述的性质,那么您仍然可以为内置项使用文本代码,这必须在应用程序中硬编码,并且存在于数据库中。它们是相当长的格式描述,有可能发生变化。这并不是世界末日,这只是另一个缺点。使用多个表可以防止对那些查找表使用外键。这不一定意味着要做更多的工作,因为您需要在两个查找表之间建立一个关系表来处理这两个查找表,这不是很好,而是可能的。但是,我仍然建议使用GUID方法,因为使用DeSepreate数据整合多个数据库更容易,而不必担心主键更改。然后,用户/客户机可以做任何他们想做的事情,他们不必担心ID重叠。最重要的是,它阻止他进行描述匹配,这听起来是他不想做的。使用多个表可以防止对那些查找表使用外键。这不一定意味着要做更多的工作,因为您需要在这两个查找表之间建立一个关系表来处理这两个查找表,这不是很好,而是可能的。但是,我仍然建议使用GUID方法,因为使用DeSepreate数据整合多个数据库更容易,而不必担心主键更改。然后,用户/客户机可以做任何他们想做的事情,他们不必担心ID重叠。最重要的是,它阻止他进行描述匹配,这听起来是他不想做的。使用多个表防止对那些查找表使用外键使用多个表防止对那些查找表使用外键