【问题标题】:Combining Characters with Id Field将字符与 Id 字段组合
【发布时间】:2015-07-15 05:00:32
【问题描述】:

我将在 MVC5 应用程序中创建一个问题表,我想为每种类型的问题使用特殊代码,如下所示:

对于 IT 相关问题 INF-0001、INF-0002、... 对于一般类型的问题 GEN-0001, GEN-0002, ...

由于我在同一张表上使用所有问题,我认为最好将 ID 号存储为 INF-0001、GEN-0001 等。在这种情况下,我应该使用字符串作为数据类型MSSQL中的ID列?或者为了存储 ID 及其相关代码的最佳方法是什么?我也考虑过使用 GUID,但不确定是否可行。提前致谢。

【问题讨论】:

  • 出于很多原因,您绝对应该将 ID(整数)字段作为您的 PK。这个问题代码也可以成为索引,但不要威胁它作为PK。此外,请准备好根据类别提出解决方案以获取下一个序列。
  • 感谢您的回复。通过牢记您的建议,我将对 id 字段使用 int 而不是 varchar。我投了赞成票:)
  • 关于这个问题的最后一个问题是:如何按顺序创建 id 编号,即 1、2、3、4 没有任何间隙?我认为在创建新项目之前检索最大 ID 不是一个好主意?任何想法?再次提前感谢...
  • @AndreCalil 有什么帮助吗?
  • 好了,我补充了塞巴斯蒂安的回答。

标签: c# sql-server asp.net-mvc asp.net-mvc-5 guid


【解决方案1】:

我想最好为您的自定义名称创建单独的字段。因此,您的表格将具有 int Id(主键)字段和 CustomName varchar(100)nvarchar(100) 类型(如果您使用 unicode 字符)字段和您的自定义名称。

如果您将JOIN 与其他人一起使用您的文件表,则使用int 作为Id 会更好。如果您想在此字段中搜索值并且速度很慢,只需创建 INDEX

【讨论】:

  • 感谢您的回复。我认为将 int 用于 id 字段而不是 varchar 是非常合乎逻辑的。我投了赞成票:)
【解决方案2】:

您可以有一个一般问题 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

【讨论】:

  • A) 看起来不错。我认为 IssueID 将是 PK,CategoryID 将是 FK,所有问题编号将根据其 CategoryIndex 依次给出。这是真的吗?
  • B) 另一方面,我需要澄清两点:1) 我是否应该结合前缀和 CategoryIndex 以便在任何页面上显示问题,即 IT-0001, GEN-0001?或者最好使用 Prefix 和 IssueID 进行组合?在那种情况下,问题似乎不会像 IT-0001、GEN-0002(而不是 GEN-0001)那样有序? 2) CategoryIndex 呢?在创建问题期间如何创建它?我的意思是,在创建问题时,我需要获取该字段的最大数量并加一?或者我应该遵循的任何其他方式?谢谢。
  • 我会选择int,但这又取决于您对上下文的偏好。 Herehere 你可以找到 intguid 的优缺点
  • 如果您的记录少于 20 亿条 - 使用 int。 Here一些解释
  • 请为此创建另一个问题,这个答案确实有很多 cmets。
猜你喜欢
  • 2021-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-03
  • 2019-05-15
  • 1970-01-01
  • 1970-01-01
  • 2012-06-26
相关资源
最近更新 更多