我想知道在处理代码中父 > 子对象的 ID 方面是否有最佳编码实践,其中数据库记录使用自动递增的 int 作为 ID(在初始保存时)。当然,在代码中,您无法猜测这个 ID 可能是什么,因此必须将其留空,并大概将所有这些项目保存在一个事务中,首先获取父 ID,然后在保存之前将其设置在所有子项上
另一方面,Guids 在代码中更容易处理,因为您当然可以先愉快地生成 Id 并将其设置在所有内容上,然后放心保存..
有没有一种很好的简单方法来处理代码中使用自动整数作为它们的数据库键的对象?
谢谢
最佳答案
GUID 似乎是您的主键的自然选择 - 如果您真的必须,您可能会争辩说将它用于表的 PRIMARY KEY。我强烈建议不要做的是使用 GUID 列作为集群键,SQL Server 默认情况下会这样做,除非您明确告诉它不要这样做。
您确实需要将两个问题分开:
1) primary key 是一种逻辑结构 - 唯一且可靠地标识表中每一行的候选键之一。这可以是任何东西,实际上 - 一个 INT、一个 GUID、一个字符串 - 选择对您的场景最有意义的东西。
2) 聚类键(在表中定义“聚簇索引”的一列或多列)- 这是一个物理存储相关的东西,在这里, 一个小的、稳定的、不断增加的数据类型是你最好的选择——INT 或 BIGINT 作为你的默认选项。
默认情况下,SQL Server 表上的主键也用作聚类键 - 但这并不需要那样做!当将以前基于 GUID 的主键/聚簇键分解为两个单独的键时,我个人看到了巨大的性能提升 - GUID 上的主(逻辑)键和单独的 INT IDENTITY(1, 1)专栏。
作为Kimberly Tripp - 索引女王 - 其他人已经多次声明 - 作为集群键的 GUID 不是最佳选择,因为由于其随机性,它将导致大量页面和索引碎片以及通常较差的性能。
是的,我知道 - SQL Server 2005 及更高版本中有 newsequentialid() - 但即使那样也不是真正和完全顺序的,因此也遇到与 GUID 相同的问题 - 只是一点点不太明显。
然后还有另一个问题需要考虑:表上的聚簇键也将添加到表上每个非聚簇索引的每个条目中 - 因此您确实希望确保它尽可能小.通常,具有 2+ 十亿行的 INT 应该足以满足绝大多数表的需求 - 与作为集群键的 GUID 相比,您可以在磁盘和服务器内存中节省数百兆字节的存储空间。
快速计算 - 使用 INT 与 GUID 作为主键和集群键:
总计:25 MB 与 106 MB - 而且这只是在一张表上!
还有一些值得思考的东西 - 金伯利·特里普 (Kimberly Tripp) 的优秀作品 - 读一遍,再读一遍,消化它!这真的是 SQL Server 索引福音。
此外:从 C#/.NET 的角度来看——这取决于您访问 SQL Server 数据库的方式。如果您使用 Linq-to-SQL 或 Entity Framework v4 之类的东西,您的 .NET 对象将使用插入的 ID(来自您的 INT IDENTITY column) - 你根本不需要做任何事情。所以对我来说,这是您应该觉得需要使用 GUID 的另一个原因....
GUID 作为 SQL Server 集群键非常糟糕 - 不仅仅是糟糕 - 真的,真的,糟糕
关于c# - Guid 与自动增量 int,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9111616/
很好奇,就使用rubyonrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提
我需要读入一个包含数字列表的文件。此代码读取文件并将其放入二维数组中。现在我需要获取数组中所有数字的平均值,但我需要将数组的内容更改为int。有什么想法可以将to_i方法放在哪里吗?ClassTerraindefinitializefile_name@input=IO.readlines(file_name)#readinfile@size=@input[0].to_i@land=[@size]x=1whilex 最佳答案 只需将数组映射为整数:@land边注如果你想得到一条线的平均值,你可以这样做:values=@input[x]
我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("
如何在ruby中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL
我正在尝试在Ruby中复制Convert.ToBase64String()行为。这是我的C#代码:varsha1=newSHA1CryptoServiceProvider();varpasswordBytes=Encoding.UTF8.GetBytes("password");varpasswordHash=sha1.ComputeHash(passwordBytes);returnConvert.ToBase64String(passwordHash);//returns"W6ph5Mm5Pz8GgiULbPgzG37mj9g="当我在Ruby中尝试同样的事情时,我得到了相同sha
C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.
我们目前正在为ROR3.2开发自定义cms引擎。在这个过程中,我们希望成为我们的rails应用程序中的一等公民的几个类类型起源,这意味着它们应该驻留在应用程序的app文件夹下,它是插件。目前我们有以下类型:数据源数据类型查看我在app文件夹下创建了多个目录来保存这些:应用/数据源应用/数据类型应用/View更多类型将随之而来,我有点担心应用程序文件夹被这么多目录污染。因此,我想将它们移动到一个子目录/模块中,该子目录/模块包含cms定义的所有类型。所有类都应位于MyCms命名空间内,目录布局应如下所示:应用程序/my_cms/data_source应用程序/my_cms/data_ty
我最喜欢的Google文档功能之一是它会在我工作时不断自动保存我的文档版本。这意味着即使我在进行关键更改之前忘记在某个点进行保存,也很有可能会自动创建一个保存点。至少,我可以将文档恢复到错误更改之前的状态,并从该点继续工作。对于在MacOS(或UNIX)上运行的Ruby编码器,是否有具有等效功能的工具?例如,一个工具会每隔几分钟自动将Gitcheckin我的本地存储库以获取我正在处理的文件。也许我有点偏执,但这点小保险可以让我在日常工作中安心。 最佳答案 虚拟机有些人可能讨厌我对此的回应,但我在编码时经常使用VIM,它具有自动保存功
我想知道是否可以通过自动创建数组来插入数组,如果数组不存在的话,就像在PHP中一样:$toto[]='titi';如果尚未定义$toto,它将创建数组并将“titi”压入。如果已经存在,它只会推送。在Ruby中我必须这样做:toto||=[]toto.push('titi')可以一行完成吗?因为如果我有一个循环,它会测试“||=”,除了第一次:Person.all.eachdo|person|toto||=[]#with1billionofperson,thislineisuseless999999999times...toto.push(person.name)你有更好的解决方案吗?
我haveaclass它公开了一个字符串值和一个int值(分别是命令输出和退出代码)。除了通过to_s和to_i公开它们之外,我还使用to_str和to_int,如下所示:classStatusdefto_s@outputendalias:to_str:to_sdefto_i@status.exitstatusendalias:to_int:to_iend我的想法是能够在尽可能多的情况下使用这个对象。将其强制转换为字符串或整数会增加可用性。例如,我可以将对象与字符串连接起来:a_string="Outputwas:"+results(我想用这个作为int强制转换的例子,但是Fixnum