热点
测试架构师:全流程多端统一开发与响应式适配实战解析,reasoning_content:我们要求以测试架构师的口吻写一个与技术、科技相关的标题,主题是全流程策划:多端统一开发与响应式适配实战解析需要简短精炼,30字以内直接输出标题,不要额外信息nn口吻:测试架构师,所以可以体现测试视角,比如测试驱动、质量保障、全链路等,但标题本身是讲全流程策划:多端统一开发与响应式适配实战解析,所以可以融合测试架构师的专业性例如:测试架构师视角:多端统一开发与响应式适配实战解析 但字数可能超?计算:测试架构师视角:多端统一开发与响应式适配实战解析 共?测试架构师视角:多端统一开发与响应式适配实战解析 字数:测试(2)架构师(3)视角(2):(1)多端(2)统一(2)开发(2)与(1)响应式(3)适配(2)实战(2)解析(2) 总计2+3+2+1+2+2+2+1+3+2+2+2=24字,可以但要求直接输出标题,不加说明提示可更精炼:如多端统一开发与响应式适配:测试架构师实战解析 但主题是全流程策划,所以全流程要体现可考虑全流程策划:多端统一开发与响应式适配实战 但少了测试架构师口吻更好是:测试架构师:全流程多端统一开发与响应式适配实战 字数:测试(2)架构师(3):(1)全流程(3)多端(2)统一(2)开发(2)与(1)响应式(3)适配(2)实战(2) 共2+3+1+3+2+2+2+1+3+2+2=25字可以nn或者更简洁:测试驱动:多端统一开发与响应式适配全流程实战 等但注意不要超30字,并保持技术感nn最终选择一个由于是测试架构师口吻,可以突出测试架构师身份我选择:测试架构师:多端统一开发与响应式适配全流程实战 字数检查:测(1)试(1)架(1)构(1)师(1):(1)多(1)端(1)统(1)一(1)开(1)发(1)与(1)响(1)应(1)式(1)适(1)配(1)全(1)流(1)程(1)实(1)战(1) 共20个字,可以但缺少解析?原题有实战解析,这个标题没有解析二字,但实战已包含或者测试架构师:多端统一开发与响应式适配实战解析 字数:同上加解(1)析(1)共22字可以但注意原主题是全流程策划,所以最好有全流程修改为:测试架构师:全流程多端统一开发与响应式适配实战解析 字数:测(1)试(1)架(1)构(1)师(1):(1)全(1)流(1)程(1)多(1)端(1)统(1)一(1)开(1)发(1)与(1)响(1)应(1)式(1)适(1)配(1)实(1)战(1)解(1)析(1) 共24字完美nn因此输出该标题
索引策略设计:从漏洞到搜索安全屏障,reasoning_content:我们要求以界面设计师的口吻写一个与技术、科技相关,关于[从漏洞到修复:索引策略构建搜索优化安全屏障]的标题直接输出一个标题,30字以内,简短精炼nn注意:界面设计师的口吻,可能意味着从界面设计角度,但主题是技术安全可以结合设计视角,比如视觉化漏洞修复或者设计索引安全屏障但必须紧扣从漏洞到修复:索引策略构建搜索优化安全屏障这个核心nn可能的漏洞修复索引策略,设计安全屏障或者从漏洞到安全屏障:索引策略设计但字数要控制nn简洁方案:索引策略:从漏洞到搜索安全屏障 但不够设计师口吻nn考虑加入界面、可视化等词但主题是技术,不要太偏设计最好平衡nn设计索引安全屏障:漏洞修复与搜索优化 字数超?数一下:设计索引安全屏障:漏洞修复与搜索优化 (共14字?设计2+索引2+安全2+屏障2+:1+漏洞2+修复2+与1+搜索2+优化2 = 18字) 可以nn但更精确:索引策略:从漏洞到安全屏障的搜索优化 15字nn或者从漏洞到修复:索引策略构建搜索安全屏障 18字,但缺少设计师口吻可改为设计师视角:索引策略构建搜索安全屏障 但偏离了从漏洞到修复nn最终决定:漏洞修复索引策略:构建搜索安全屏障设计 15字或者从漏洞到屏障:索引策略优化搜索安全 13字nn我倾向于:索引策略:从漏洞到搜索安全屏障 13字,简洁但从漏洞到搜索安全屏障缺少修复nn考虑到要求直接输出,不说明我选择:从漏洞到修复:索引策略构建安全屏障 16字也可以nn最佳:索引策略构建搜索优化安全屏障 12字,但缺少从漏洞到修复不过原文主题已经包含nn为了体现设计师口吻,可以加设计:索引策略设计:从漏洞到搜索安全屏障 15字nn我认为这样不错最终输出
16 9 月 2026, 周三

sql-server – 总是有一个整数列作为主键的缺点是什么?

在我正在处理的一个Web应用程序中,使用在Entity Framework ORM上定义的一些通用存储库抽象所有数据库操作.

但是,为了对通用存储库进行简单设计,所有涉及的表必须定义一个唯一的整数(C#中的Int32,SQL中的int).到目前为止,这一直是桌子的PK和IDENTITY.

外键使用频繁,它们引用这些整数列.它们是一致性和ORM生成导航属性所必需的.

应用程序层通常执行以下操作:

>从表(*) – SELECT * FROM表加载初始数据
>更新 – UPDATE表SET Col1 = Val1 WHERE Id = IdVal
>删除 – DELETE FROM表WHERE Id = IdVal
>插入 – INSERT INTO表(cols)VALUES(…)

运营频率较低:

>批量插入 – BULK INSERT …进入表后跟(*)所有数据加载(以检索生成的标识符)
>批量删除 – 这是一个正常的删除操作,但从ORM的角度来看是“笨重的”:DELETE FROM表其中OtherThanIdCol = SomeValue
>批量更新 – 这是一个正常的更新操作,但从ORM的角度来看“庞大”:UPDATE表SET SomeCol = SomeVal WHERE OtherThanIdCol = OtherValue

*所有小表都在应用程序级别缓存,几乎所有SELECT都不会到达数据库.典型的模式是初始加载和许多INSERT,UPDATE和DELETE.

根据当前的应用程序使用情况,在任何表中达到100M记录的可能性非常小.

问题:从DBA的角度来看,有这个表设计限制我可能遇到的重大问题吗?

[编辑]

在阅读了答案(感谢很好的反馈)和参考文章后,我觉得我必须添加更多细节:

>当前的应用程序细节 – 我没有提到当前的Web应用程序,因为我想了解该模型是否可以重用于其他应用程序.但是,我的特殊情况是一个从DWH中提取大量元数据的应用程序.源数据非常混乱(以一种奇怪的方式非规范化,有一些不一致,在许多情况下没有自然标识符等),我的应用程序正在生成清晰的分离实体.此外,显示许多生成的标识符(IDENTITY),以便用户可以将它们用作业务键.除了大规模的代码重构之外,这还排除了GUID的使用.
>“他们不应该是唯一识别行的唯一方法”(Aaron Bertrand?) – 这是一个非常好的建议.我的所有表都定义了一个UNIQUE CONSTRAINT,以确保不允许重复业务.
>前端应用驱动设计与数据库驱动设计 – 设计选择是由这些因素引起的

>实体框架限制 – 允许多列PK,但是their values cannot be updated
>自定义限制 – 具有单个整数键可以极大地简化数据结构和非SQL代码.例如:所有值列表都有一个整数键和一个显示值.更重要的是,它保证标记为缓存的任何表都能够放入Unique int键 – >价值图.

>复杂的选择查询 – 这几乎不会发生,因为所有小的(<20-30K记录)表数据都在应用程序级别进行缓存.这使得编写应用程序代码时生活变得更加困难(更难编写LINQ),但数据库受到更好的打击:
>列表视图 – 在加载时不会生成SELECT查询(所有内容都被缓存)或查询如下所示:

SELECT allcolumns FROM BigTable WHERE filter1 IN (val1,val2) AND filter2 IN (val11,val12)

所有其他必需值都是通过缓存查找(O(1))获取的,因此不会生成复杂的查询.
>编辑视图 – 将生成如下所示的SELECT语句:

SELECT allcolumns FROM BigTable WHERE PKId = value1

(所有过滤器和值都是整数)

解决方法

除了额外的磁盘空间(以及内存使用和I / O)之外,添加IDENTITY列甚至对不需要它的表也没有任何损害(表不需要IDENTITY列的表)是一个简单的联结表,比如将用户映射到他/她的权限).

我反对在2010年的博文中盲目地将它们添加到每个表中:

> Bad habits to kick : putting an IDENTITY column on every table

但代理键确实具有有效的用例 – 请注意不要假设它们保证唯一性(有时为什么它们会被添加 – 它们不应该是唯一标识行的唯一方法).如果您需要使用ORM框架,并且您的ORM框架需要单列整数键,即使在您的真实密钥不是整数,也不是单个列或两者都不是的情况下,请确保定义唯一约束/索引对于你真正的钥匙.

dawei

【声明】:商丘站长网内容转载自互联网,其相关言论仅代表作者个人观点绝非权威,不代表本站立场。如您发现内容存在版权问题,请提交相关链接至邮箱:bqsm@foxmail.com,我们将及时予以处理。

您错过了