C# 使用Visual Studio在SQL Server中填充主键值的最佳实践

C# 使用Visual Studio在SQL Server中填充主键值的最佳实践,c#,sql-server,C#,Sql Server,我正在为大学做一个项目,偶然发现了一个问题,我不知道如何以最好的方式处理它 我有一个手动创建的SQL Server数据库,还有一个在Visual Studio中用C#编写的Winforms项目。应用程序应该对数据库执行CRUD操作 我的问题是,操作表中主键列的最佳方法是什么?我应该在数据库中将它们定义为自动递增整数并让数据库管理系统处理主键,还是应该将它们定义为int并在VisualStudio项目中以编程方式填充它们,如果是这样的话,该如何做 我不是在寻找完整的解决方案,只是想暗示一下什么是最

我正在为大学做一个项目,偶然发现了一个问题,我不知道如何以最好的方式处理它

我有一个手动创建的SQL Server数据库,还有一个在Visual Studio中用C#编写的Winforms项目。应用程序应该对数据库执行CRUD操作

我的问题是,操作表中主键列的最佳方法是什么?我应该在数据库中将它们定义为自动递增整数并让数据库管理系统处理主键,还是应该将它们定义为int并在VisualStudio项目中以编程方式填充它们,如果是这样的话,该如何做

我不是在寻找完整的解决方案,只是想暗示一下什么是最好的方法


我是一个初学者,所以请温柔点…

一般来说,自动递增(或
identity
serial
)主键是最好的选择。您通常不希望应用程序担心这些值是否已经被使用

如果您的应用程序是多线程的——也就是说,同时有多个用户——那么数据库将处理所有冲突。那很方便

我是数据库创建的代理键的粉丝。在按主键对行进行集群(排序)的数据库中,使用自动递增的值更有效。数据库可以解决这个问题


在某些情况下,您需要自然密钥。当然,这也是允许的。但是,如果要为表发明主键,就让数据库来完成这项工作。

在为CRUD操作定义DB备份结构时,您需要问问自己:

我的主键高度可预测是否重要

我的意思是,如果我启动一个用户到一个屏幕,比如“whatever.com/something/edit/1”

除了明显的安全性之外,用户可以操纵url并向路径中注入2、3或4,这对业务流程有帮助还是有害

如果这不重要,那么在DB端将其绝对设置为auto incremintng int,并将该责任区域转移给数据库来处理。现在,您不再需要高度关注密钥生成

如果有关系,则将主键设置为唯一标识符。在代码中,当添加新记录集时,您将生成一个新的GUID并将其设置为主键(GUID.NewGuid())。这将防止用户以不受控制的方式遍历数据,因为随机猜测guid会给他们带来问题。前任: 新路径:“whatever.com/something/edit/0f8fad5b-d9cb-469f-a165-70867728950e”

并不是说不可能偶然发现一些东西,但使用您的应用程序的普通用户不会太倾向于使用url操纵进行探索,因为他们会浪费99.99%的时间在invlaid帖子上,试图猜测在您的数据库中注册的有效GUID


作为补充说明,如果您决定将主键保留为int,而不使用自动增量,那么您只是在为自己设置大量不必要的工作,我个人从未见过任何实际的投资回报,您有权检查占位符是否已被使用。想想追踪历史?如果您曾经决定从表中删除记录,然后重新使用它们,那么您将面临一个痛苦的世界。这是你在做什么的基础上必须处理的另一整套问题

这实际上与Visual Studio无关,更多的是与数据库管理和设计有关。答案是thnx,但还有一个。。。在上面关于另一条线索的评论中,有人指出了我偶然发现的情况。在设计应用程序时以及在测试过程中,如果它按预期工作,我会将主键分别插入为1、2、3、4、5、1004、1005、1006、2004、3004、3005。我在一个表中没有那么多行,但它以某种方式填充了它。我怎样才能克服这个问题?@domac385。您没有描述实际问题。自动递增的主键中允许有间隙。这是一个关键的性能特性,它允许数据库实现功能并保持性能。没问题。我知道这是可行的。假设我患有强迫症,这种情况会让我感到痛苦。我只是想知道是否有一种方法,如果我在数据库中对主键使用自动递增,它们将按连续顺序填充,而不是跳两行1000个数字。@domac385。您可以使用
序列
,但这会给数据库增加很多开销。您不应该让这些无关的考虑因素影响数据库的设计。主键中的间隙是数据库生命中的一个事实。我的意思不是不尊重,但如果主键中的空白导致您痛苦,我认为您应该限制对数据库的接触。谢谢您的回复。。。首先,我不是在创建一个web应用程序,而是在创建一个windows应用程序,所以关于url的这一部分并不是问题域的一部分。在数据库中,我将主键列设置为整数,在属性中设置“Is Identity”属性,并将increment设置为1,所以据我所知,主键是自动生成并递增的。。。我的问题是,这些自动递增的值不是连续的,而是以千个数字为间隔的。如果删除行或发出回滚的db事务,就会发生这种情况。这引起关注是出于商业原因还是出于好奇?正如我在上面回答戈登的,这只是我的强迫症问题,没有商业理由不这样做。。。我只是想让事情保持整洁和舒适,所以我想知道是否有一种方法可以实现id列(主键)是按连续顺序填充的,而不是有如此大的差异