加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

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

发布时间:2021-05-27 16:11:46 所属栏目:编程 来源:网络整理
导读:在我正在处理赏罚的一个Web应用措施中,行使在Entity Framework ORM上界说的一些通用存储库抽象全部数据库操纵. 可是,为了对通用存储库举办简朴计划,全部涉及的表必需界说一个独一的整数(C#中的Int32,SQL中的int).到今朝为止,这一向是桌子的PK和IDENTITY. 外键行使

在我正在处理赏罚的一个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框架必要单列整数键,纵然在您的真实密钥不是整数,也不是单个列或两者都不是的环境下,请确保界说独一束缚/索引对付你真正的钥匙.

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读