我将在 MVC5 应用程序中创建一个问题表,我想对每种类型的问题使用特殊代码,如下所示:
有关 IT 相关问题 INF-0001, INF-0002, ... 对于一般类型的问题 GEN-0001, GEN-0002, ...
由于我在同一张桌子上使用所有问题,我认为最好将ID号存储为INF-0001,GEN-0001,...等。在这种情况下,我应该使用字符串作为 MSSQL 中 ID 列的数据类型吗?或者,为了存储 Id 及其相关代码的最佳方法是什么?我也想使用 GUID,但我不确定这是否可能。提前谢谢。
我想最好为您的自定义名称创建单独的字段。因此,您的表将具有int
Id
(主键)字段和CustomName
varchar(100)
或nvarchar(100)
类型(如果使用 unicode 字符)字段以及自定义名称。
如果您与其他人一起JOIN
文件表,则最好将int
用作Id
。如果您想在此字段中搜索值并且速度很慢,只需创建INDEX
.
您可以有一个常规问题 ID和一个类别,例如:
表:问题
------------------------------------
IssueID | CategoryID | CategoryIndex
------------------------------------
1 | 1 | 1
2 | 1 | 2
3 | 2 | 1
4 | 1 | 3
表:类别
-----------------------------
CategoryID | Prefix | Name
-----------------------------
1 | INF | IT
2 | GEN | General
然后,在查询这些表时计算问题编号。 如果要在数据库发生更改时跟踪问题编号,则可以将计算出的数字存储在表中(例如:IT 相关问题的前缀从INF
更改为IT
)
现在您已经有了良好的架构,如何控制问题表上的类别顺序?看看这个:
DECLARE @categoryID INT
DECLARE @nextSequence INT
SET @categoryID = 1 --You'll have to change this!
SELECT @nextSequence = i.CategoryIndex
FROM Issue i
WHERE i.CategoryID = @categoryID
SELECT COALESCE(@nextSequence, 0) + 1 as 'NextSequence'
您可以将其转换为存储过程(NextSequence
,也许?),该过程接收INT
作为参数(类别 ID)并返回另一个INT
作为结果(新问题的CategoryIndex
)。
最后,要创建完整代码,请执行以下操作:
SELECT
i.IssueID
, c.Prefix + '-' + RIGHT('0000' + CONVERT(VARCHAR(4), i.CategoryIndex), 4) as 'IssueCode'
FROM Issue i
INNER JOIN Category c ON i.CategoryID = c.CategoryID